hdu3555Bomb

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3555

算是第一道数位dp的题了。。。

 1 #include<cstdio>
 2 #include<cstring>
 3 #define ll long long
 4 ll dp[20][3];
 5 /*
 6 dp[i][0] 前i位含49
 7 dp[i][1] 前i-1位不含49,但第i位是9
 8 dp[i][2] 前i位不含49
 9 */
10 void init()
11 {
12     memset(dp,0,sizeof(dp));
13     dp[0][2]=1;
14     for(int i=1;i<21;i++)
15     {
16 
17         dp[i][0]=(ll)dp[i-1][0]*10+dp[i-1][1];
18         dp[i][1]=(ll)dp[i-1][2];
19         dp[i][2]=(ll)dp[i-1][2]*10-dp[i-1][1];
20     }
21 }
22 int bit[20];
23 ll n;
24 ll ans;
25 
26 int  main()
27 {
28 
29     init();
30     int t;
31     scanf("%d",&t);
32     while(t--)
33     {
34         ans=0;
35         scanf("%lld",&n);
36         int i=0;
37         n++;
38         while(n)
39         {
40             bit[++i]=n%10;
41             n/=10;
42         }
43         bit[i+1]=0;
44         int flag=0;
45         for(int j=i;j;j--)
46         {
47             ans+=dp[j-1][0]*bit[j];
48             if(flag) ans+=dp[j-1][2]*bit[j];
49             else   if(bit[j]>4) ans+=dp[j-1][1];
50             if(bit[j]==9&&bit[j+1]==4) flag=1;
51         }
52         printf("%lld\n",ans);
53     }
54 }

 

posted @ 2017-03-28 08:19  yijiull  阅读(97)  评论(0编辑  收藏  举报