题目链接: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 ",ans); 53 } 54 }