【数位DP】 hdu3555 Bomb
2012-08-22 00:33
295 查看
Bomb
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3555
题意:给你一个数字N(1 <= N <= 2^63-1),问在1~N这些数字中,“49”这个序列出现多少次。
题解:数位DP。其实就是以一位数为单位的DP,有点类似AC自动机里的字典树。
我们可以根据字典树把情况分为3种,序列中出现“49”,序列中没有“49”但是最后一位是“4”,序列中没有“49”且最后一位不为“4”。
在这3种状态中进行转移即可。
dp[k][0] = dp[k - 1][1] * 8 + dp[k - 1][0] * 9; 0 不含49且以非4的数字结尾
dp[k][1] = dp[k - 1][0] + dp[k - 1][1]; 1 不含49且以4这个数字结尾
dp[k][2] = dp[k - 1][2] * 10 + dp[k - 1][1]; 2 含49的状态
代码:
来源:http://blog.csdn.net/ACM_Ted
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3555
题意:给你一个数字N(1 <= N <= 2^63-1),问在1~N这些数字中,“49”这个序列出现多少次。
题解:数位DP。其实就是以一位数为单位的DP,有点类似AC自动机里的字典树。
我们可以根据字典树把情况分为3种,序列中出现“49”,序列中没有“49”但是最后一位是“4”,序列中没有“49”且最后一位不为“4”。
在这3种状态中进行转移即可。
dp[k][0] = dp[k - 1][1] * 8 + dp[k - 1][0] * 9; 0 不含49且以非4的数字结尾
dp[k][1] = dp[k - 1][0] + dp[k - 1][1]; 1 不含49且以4这个数字结尾
dp[k][2] = dp[k - 1][2] * 10 + dp[k - 1][1]; 2 含49的状态
代码:
#include<cstdio> #include<cstring> using namespace std; #define LL long long char s[25]; LL dp[25][3][2]; /* dp[k][0] = dp[k - 1][1] * 8 + dp[k - 1][0] * 9; dp[k][1] = dp[k - 1][0] + dp[k - 1][1]; dp[k][2] = dp[k - 1][2] * 10 + dp[k - 1][1]; 0 不含49且以非4的数字结尾 1 不含49且以4这个数字结尾 2 含49的状态 */ int next(int a,int b) { if(a==2||(a==1&&b==9)) return 2; else return b==4; } int main() { int t; scanf("%d",&t); for(; t--;) { scanf("%s",s+1); memset(dp,0,sizeof(dp)); int len=strlen(s+1); dp[0][0][1]=1; for(int i=1; i<=len; ++i) { dp[i][0][0] = dp[i-1][0][0]*9 + dp[i-1][1][0]*8; dp[i][1][0] = dp[i-1][0][0] + dp[i-1][1][0]; dp[i][2][0] = dp[i-1][2][0] * 10 + dp[i-1][1][0]; for(int j=0; j<s[i]-'0'; ++j) { dp[i][next(0,j)][0]+=dp[i-1][0][1]; dp[i][next(1,j)][0]+=dp[i-1][1][1]; dp[i][next(2,j)][0]+=dp[i-1][2][1]; } dp[i][next(0,s[i]-'0')][1]+=dp[i-1][0][1]; dp[i][next(1,s[i]-'0')][1]+=dp[i-1][1][1]; dp[i][next(2,s[i]-'0')][1]+=dp[i-1][2][1]; } printf("%I64d\n",dp[len][2][0]+dp[len][2][1]); } }
来源:http://blog.csdn.net/ACM_Ted
相关文章推荐
- HDU3555 Bomb(数位dp)
- HDU3555 Bomb 数位DP第一题
- 【数位DP】HDU3555-Bomb
- hdu3555 Bomb(数位DP)
- HDU3555[Bomb]--数位DP
- [暑假集训--数位dp]hdu3555 Bomb
- hdu3555---Bomb(数位dp,水)
- hdu3555 - Bomb(2010 ACM-ICPC Multi-University Training Contest(12))数位dp
- HDU3555 Bomb —— 数位DP
- 【数位DP入门】HDU3555 Bomb
- hdu3555 Bomb(数位dp)
- hdu3555--Bomb(数位dp练习3)
- HDU3555 Bomb[数位DP]
- HDU3555 Bomb[数位DP]
- hdu3555 Bomb[数位dp]
- hdu3555 Bomb(数位dp)
- hdu3555 Bomb(数位dp)
- hdu3555——Bomb(数位DP)
- HDU3555 Bomb(数位dp)
- hdu3555 Bomb ——数位DP入门题