hdu3555 数位dp

Posted walfy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu3555 数位dp相关的知识,希望对你有一定的参考价值。

题意:求1到n的数中含49的有多少个

和上一题类似,但是这题如果直接算含49的会有一点问题,所以先算不含49的然后用n-就好了,注意求1到n算的是n+1的

还有就是这题有毒,必须要用__int64而不能用long long

技术分享
#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<cstdio>
#include<cassert>
#include<iomanip>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define C 0.5772156649
#define pi acos(-1.0)
#define ll long long
#define mod 1000000007
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#pragma comment(linker, "/STACK:1024000000,1024000000")

using namespace std;

const double g=10.0,eps=1e-7;
const int N=20+10,maxn=1000000+10,inf=0x3f3f3f;

__int64 f[N][N];
void init()
{
    memset(f,0,sizeof f);
    f[0][0]=1;
    for(int i=1;i<=20;i++)
        for(int j=0;j<=9;j++)
            for(int k=0;k<=9;k++)
            {
                if(j==4&&k==9)continue;
                f[i][j]+=f[i-1][k];
            }
}
__int64 getnum(__int64 x)
{
    __int64 ans=0,len=0,digit[30];
    while(x)
    {
        digit[++len]=x%10;
        x/=10;
    }
    for(int i=len;i>=1;i--)
    {
        for(int j=0;j<digit[i];j++)
            if(j!=9||digit[i+1]!=4)
               ans+=f[i][j];
        if(digit[i]==9&&digit[i+1]==4)break;
    }
    return ans;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    init();
    int t;
    cin>>t;
    while(t--)
    {
        __int64 n;
        cin>>n;
        cout<<n+1-getnum(n+1)<<endl;
    }
    return 0;
}
/********************

********************/
View Code

 

以上是关于hdu3555 数位dp的主要内容,如果未能解决你的问题,请参考以下文章

HDU 3555Bomb 数位DP

Bomb HDU - 3555 (数位DP)

HDU 3555 数位dp入门

数位DP入门题 hdu 2089 hdu 3555

HDU - 3555 - Bomb(数位DP)

HDU 3555 数位DP