首页 > 代码库 > 数位DP
数位DP
HDU 3555 BOMB
http://acm.hdu.edu.cn/showproblem.php?pid=3555
不能出现相邻的49
正在学习。。。会了自己写
+ View Code?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | #include<iostream> using namespace std; LL dp[21][3],n; int len,bit[21]; //dp[i][0]表示长度为i,包括49的个数 //dp[i][1]表示长度为i,没有49但是开头为9的个数 //dp[i][2]表示长度为i,没有49 void Init(){ memset (dp,0, sizeof (dp)); dp[0][2]=1; for ( int i=1;i<20;i++){ dp[i][0]=(LL)dp[i-1][0]*10+dp[i-1][1]; dp[i][1]=dp[i-1][2]; dp[i][2]=(LL)dp[i-1][2]*10-dp[i-1][1]; } } int main(){ Init(); int t; scanf ( "%d" ,&t); while (t--){ scanf ( "%I64d" ,&n); len=0; n++; while (n){ bit[++len]=n%10; n/=10; } bit[len+1]=0; LL ans=0; bool flag= false ; for ( int i=len;i;i--){ ans+=(LL)dp[i-1][0]*bit[i]; if (flag) ans+=(LL)dp[i-1][2]*bit[i]; if (!flag&&bit[i]>4) ans+=dp[i-1][1]; if (bit[i]==9&&bit[i+1]==4) flag= true ; } printf ( "%I64d\n" ,ans); } return 0; } |
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。