HDU 3555 Bomb 基础数位dp

来源:互联网 发布:淘宝中差评外包 编辑:程序博客网 时间:2024/04/28 23:10

题意大致就是说给你一个数n,要你求0~n之间含有49的数的个数

理解题意很简单下面就直接贴代码了

#include<iostream>#include<cstdio>#include<cstring>#include<string>using namespace std;__int64 dp[21][4];int a[1000];void init(){    memset(dp,0,sizeof(dp));    dp[0][0]=1;    for(int i=1;i<=20;i++)    {        dp[i][0]=dp[i-1][0]*10-dp[i-1][1];  //不含49的个数        dp[i][1]=dp[i-1][0];                //不含49但是最高位为9        dp[i][2]=dp[i-1][1]+dp[i-1][2]*10;  //含有49的个数    }}int main(){    int n,len;    init();    scanf("%d",&n);    while(n--)    {        len=0;        __int64 m,ans=0,flag=0;        scanf("%I64d",&m);        m++;        memset(a,0,sizeof(a));        while(m)        {            a[++len]=m%10;            m/=10;        }        int g=0;        for(int i=len;i>=1;i--)        {            ans+=a[i]*dp[i-1][2];      //对于每位先加上含有49的            if(flag)            {                ans+=a[i]*dp[i-1][0];     //如果之前就已经构成了49,那么加上不能构成49的            }            if(!flag && a[i]>4)      //加上最高位为9的,添加一个4进去            ans+=dp[i-1][1];            if(g==4 && a[i]==9)            flag=1;            g=a[i];        }        printf("%I64d\n",ans);    }    return 0;}


原创粉丝点击