HDU 3555 Bomb

来源:互联网 发布:拼接屏调试软件 编辑:程序博客网 时间:2024/04/30 23:20

最近在练数位dp,这题还是wang了一发,这题是基本题,没什么好说的,附上代码。

#include<stdio.h>#include<string.h>#define LL unsigned long longLL dp[3][30];LL a[30];void init(){    int i,j,k;    dp[0][0]=1;    for(i=1;i<22;i++)    {        dp[0][i]=dp[0][i-1]*10-dp[1][i-1];        dp[1][i]=dp[0][i-1];        dp[2][i]=dp[2][i-1]*10+dp[1][i-1];    }}LL solve(LL n){    int i,j,k,len;    for(i=1;n;i++)    {        a[i]=n%10;        n/=10;    }    len=i;    a[len]=0;    LL ans=0,flag=0;    for(i=len-1;i>0;i--)    {        ans+=a[i]*dp[2][i-1];        if(flag)ans+=a[i]*dp[0][i-1];        else        {            if(a[i]>4)ans+=dp[1][i-1];//这里刚开始写成if(a[i+1]>4)ans+=dp[0][i-1],错了一次~        }        if(a[i+1]==4&&a[i]==9)flag=1;    }    return ans;}int main(){    init();    int i,j,k,t;    LL n;    scanf("%d",&t);    while(t--)    {        scanf("%I64u",&n);        printf("%I64u\n",solve(n+1));    }    return 0;}