【HDOJ】【3555】Bomb

数位DP


cxlove基础数位DP第二题

与上题基本相同(其实除了变成long long以外其实更简单了……)

 1 //HDOJ 3555
 2 #include<cmath>
 3 #include<vector>
 4 #include<cstdio>
 5 #include<cstring>
 6 #include<cstdlib>
 7 #include<iostream>
 8 #include<algorithm>
 9 #define rep(i,n) for(int i=0;i<n;++i)
10 #define F(i,j,n) for(int i=j;i<=n;++i)
11 #define D(i,j,n) for(int i=j;i>=n;--i)
12 #define pb push_back
13 using namespace std;
14 int getint(){
15     int v=0,sign=1; char ch=getchar();
16     while(!isdigit(ch)) {if(ch=='-') sign=-1; ch=getchar();}
17     while(isdigit(ch))  {v=v*10+ch-'0'; ch=getchar();}
18     return v*sign;
19 }
20 const int N=1e7+10,INF=~0u>>2;
21 const double eps=1e-8;
22 typedef long long LL;
23 /*******************template********************/
24 LL dp[25][3];
25 LL len,bit[25];
26 //dp[i][0]表示不含49的i位数字
27 //dp[i][1]表示不含49,且最高位为9 
28 //dp[i][2]表示存在49 
29 void init(){
30     dp[0][0]=1;
31     F(i,1,20){
32         dp[i][0]=(LL)dp[i-1][0]*10-dp[i-1][1];
33         dp[i][1]=dp[i-1][0];
34         dp[i][2]=(LL)dp[i-1][2]*10+dp[i-1][1];
35     }
36 }
37 LL solve(LL n){
38     len=0; n++;
39     for(;n;n/=10) bit[++len]=n%10;
40     bit[len+1]=0;
41     printf("check : ");
42     D(i,len,1) printf("%lld",bit[i]);
43     printf("\n");
44     LL ans=0;
45     bool flag=false;
46     D(i,len,1){
47         ans+=(LL)dp[i-1][2]*bit[i];
48         if (flag) ans+=(LL)dp[i-1][0]*bit[i];
49         if (!flag && bit[i]>4) ans+=dp[i-1][1];
50         if (bit[i+1]==4 && bit[i]==9) flag=true;
51     }
52     return ans;
53 }
54 int main(){
55     init();
56     int T;LL n;
57     for(T=getint();T;T--){
58         scanf("%I64d",&n);
59         printf("%I64d\n",solve(n));
60     }
61     return 0;
62 }
View Code

 

posted @ 2015-03-01 17:28  Tunix  阅读(190)  评论(0编辑  收藏  举报