HDU 3555 数位dp入门

开始想用dp[i][j]来记录第i位j开头含有49的数的个数 但是init后并不知道如何进行cal

想了想可以用不要62的思想 当作不要49来做 然后减一下 就好

看网上的代码 不要62和这道题用的dp方法和cal都与我用的有很大不同

做完入门水题就去学习一下那种很正规的方法~

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<math.h>
#include<queue>
using namespace std;
/// 含有49 为吉利数
long long int dp[50][11];
/// dp[i][j] i为第i位 j为首数字 dp含义有多少吉利数
/// 可以化作 不要62 类型来做 最后减去就可以
long long int n;
void init(){
memset(dp,0,sizeof(dp));
for(int i=0;i<=9;i++)
    dp[1][i]=1;
for(int i=1; i<=45;i++)
{
    for(int j=0;j<=9;j++)
    {
        for(int k=0;k<=9;k++)
        {
            if(!(j==4&&k==9))
            {
                dp[i][j]+=dp[i-1][k];
            }
        }
    }

}
}
long long int cal(long long int x)
{
    long long int sum=x;
    int z=0;
    int A[50];
    while(x>0)
    {
        z++;
        A[z]=x%10;
        x/=10;
    }
    A[z+1]=0;
    long long int ans=0;
    for(int i=z;i>=1;i--)
    {
        for(int j=0;j<A[i];j++)
        {
            if(!(A[i+1]==4&&j==9))
            ans+=dp[i][j];
        }
        if(A[i+1]==4&&A[i]==9)
            break;
    }
    return sum-ans;
}
int main(){
init();
int t;
scanf("%d",&t);
while(t--)
{
    scanf("%I64d",&n);
    printf("%I64d\n",cal(n+1));
}
}

  

时间: 2024-10-13 16:08:13

HDU 3555 数位dp入门的相关文章

HDU 2089 数位dp入门

开始学习数位dp...一道昨天看过代码思想的题今天打了近两个小时..最后还是看了别人的代码找bug...(丢丢) 传说院赛要取消 ? ... 这么菜不出去丢人也好吧~ #include<stdio.h> #include<string.h> #include<algorithm> #include<map> #include<math.h> #include<queue> using namespace std; int n,m; /

HDU 3555 数位dp

Bomb Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)Total Submission(s): 15072    Accepted Submission(s): 5441 Problem Description The counter-terrorists found a time bomb in the dust. But this time the terrorists

hdu 3555 数位dp水题 记忆化搜索做法

#include<iostream> #include<cstring> #include<cstdio> using namespace std ; const int maxn = 20; __int64 dp[maxn][3] ;//dp[i][flag] ,flag = 2,表示已经有49,flag == 1,表示没有49,这一位是4, int bit[maxn] ;    //flag == 0, 什么都没有 __int64 dfs(int pos , int

数位DP入门题 hdu 2089 hdu 3555

hdu 2089 不要62 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 题意:对于每次给出的一个区间,找出区间内多少个数字没有出现62和4. 思路: 数位DP入门题,对于dfs设置3个参数. 一个表示现在进行到第几位, 一个表示前一个标记状态,这里表示上一位是不是6. 一个表示是否现在是这位可以取到的最大的数字. 如果上一位是6,那么这位不可以取2.且当前位都不可以取4. 1 #include <bits/stdc++.h> 2 us

HDU 2089 不要62 数位DP入门

Problem Description 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer).杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障碍,更安全地服务大众.不吉利的数字为所有含有4或62的号码.例如:62315 73418 88914都属于不吉利号码.但是,61152虽然含有6和2,但不是62连号,所以不属于不吉利数字之列.你的任务是,对于每次给出的一个牌照区间号,推断出交管局今次又要实际上给多

HDU 2089 不要62【数位DP入门题】

不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 56193    Accepted Submission(s): 21755 Problem Description 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer).杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可

hdu 4734 数位dp

http://acm.hdu.edu.cn/showproblem.php?pid=4734 Problem Description For a decimal number x with n digits (AnAn-1An-2 ... A2A1), we define its weight as F(x) = An * 2n-1 + An-1 * 2n-2 + ... + A2 * 2 + A1 * 1. Now you are given two numbers A and B, plea

hdu 4352 数位dp(最长上升子序列的长度为k的个数)

http://acm.hdu.edu.cn/showproblem.php?pid=4352 Problem Description #define xhxj (Xin Hang senior sister(学姐)) If you do not know xhxj, then carefully reading the entire description is very important. As the strongest fighting force in UESTC, xhxj grew

hdu 3709 数位dp(小思维)

http://acm.hdu.edu.cn/showproblem.php?pid=3709 Problem Description A balanced number is a non-negative integer that can be balanced if a pivot is placed at some digit. More specifically, imagine each digit as a box with weight indicated by the digit.