hdu3555 Bomb 数位DP

来源:互联网 发布:软件杯全国软件大赛 编辑:程序博客网 时间:2024/05/01 23:34

数位DP初学者,代码就是网上千篇一律,相似度极高的数位DP代码

一个不错的题解http://www.cnblogs.com/luyi0619/archive/2011/04/29/2033117.html

#include<iostream>#include<cstring>#include<cstdio>#define llong long longusing namespace std;llong dp[20][3];int digit[20];int main(){int i;int t;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];}scanf("%d",&t);while(t--){int len=0,last=0;llong ans=0;unsigned llong n=0;scanf("%I64d",&n);n++;   //有人问这一步用途,可以分别带入49和50模拟一下代码的运行过程memset(digit,0,sizeof(digit));while(n){digit[++len]=n%10;n/=10;}bool flag=0;for(i=len;i>=1;i--){ans+=dp[i-1][2]*digit[i];if(flag) ans+=dp[i-1][0]*digit[i];if(!flag&&digit[i]>4) ans+=dp[i-1][1];if(last==4&&digit[i]==9) flag=1;last=digit[i];}printf("%I64d\n",ans);}return 0;}


原创粉丝点击