so the answer is 15.
第一个数位动规!!!!
看代码理解的,差不多懂那么点点点了。
AC代码如下:
#include<iostream> #include<cstring> #include<algorithm> #include<cmath> #include<cstdio> using namespace std; int main() { __int64 dp[20][3];//0表示该位数中不含49的情况数,1表示不含49但头为9的情况数,2表示含49的情况数 int i,j; memset(dp,0,sizeof dp); dp[0][0]=1; for(i=1;i<=20;i++) { dp[i][0]=dp[i-1][0]*10-dp[i-1][1]; dp[i][1]=dp[i-1][0]; dp[i][2]=dp[i-1][2]*10+dp[i-1][1]; //cout<<dp[i][0]<<" "<<dp[i][1]<<" "<<dp[i][2]<<endl; } int t; cin>>t; __int64 num[30]; __int64 n; while(t--) { memset(num,0,sizeof num); cin>>n; n++;//这一步很重要 int tt=1; while(n) { num[tt++]=n%10; n/=10; } __int64 ans=0; int flag=0;int last=0; for(i=tt-1;i>=1;i--) { ans+=num[i]*dp[i-1][2]; if(flag==1) ans+=dp[i-1][0]*num[i]; if(flag==0&&num[i]>4) ans+=dp[i-1][1]; if(num[i+1]==4&&num[i]==9) flag=1; } cout<<ans<<endl; } return 0; }
原文地址:http://blog.csdn.net/hanhai768/article/details/37758203