hdu 3555 Bomb (数位DP)
2013-10-18 21:24
429 查看
题意:给你一个数n,找出小于n且不包含'49'的数的个数
思路:dp[a][c]表示位数为a,开头为[b]b,且是否包含49为c的数的个数(c==1表示包含49,反之不包含)
状态转移方程为:
if c==1
{
dp[i][j][1]+=dp[i-1][k][1]; (0=<j<=9)
if(j==4&&k==9)
{
dp[i][j][1]+=dp[i-1][k][0]; (0=<j<=9)
}
}
else
{
if(!(j==4&&k==9))
{
dp[i][j][0]+=dp[i-1][k][0]; (0=<j<=9)
}
预处理000000000000000000~999999999999999999的dp值,最后从n的高位到低为依次询问,统计数字比n当前为小的数字,最后特判n本身是否合法即可。因为数字比较大,得用long long计数,2A。
思路:dp[a][c]表示位数为a,开头为[b]b,且是否包含49为c的数的个数(c==1表示包含49,反之不包含)
状态转移方程为:
if c==1
{
dp[i][j][1]+=dp[i-1][k][1]; (0=<j<=9)
if(j==4&&k==9)
{
dp[i][j][1]+=dp[i-1][k][0]; (0=<j<=9)
}
}
else
{
if(!(j==4&&k==9))
{
dp[i][j][0]+=dp[i-1][k][0]; (0=<j<=9)
}
预处理000000000000000000~999999999999999999的dp值,最后从n的高位到低为依次询问,统计数字比n当前为小的数字,最后特判n本身是否合法即可。因为数字比较大,得用long long计数,2A。
#include <iostream> #include <cstdio> #include <cstring> #define LL long long using namespace std; LL dp[20][12][2]; int numn[20]; int lenn; LL n; void work() { dp[0][0][0]=1; for(int i=1;i<=20;i++) for(int j=0;j<=9;j++) for(int k=0;k<=9;k++) { dp[i][j][1]+=dp[i-1][k][1]; if(j==4&&k==9) { dp[i][j][1]+=dp[i-1][k][0]; } else { dp[i][j][0]+=dp[i-1][k][0]; } } } void cal() { lenn=0; while(n) { numn[++lenn]=n%10; n/=10; } } LL solve() { LL res=0; int flag=0; for(int i=lenn;i>0;i--) { // cout<<i<<endl; for(int j=0;j<numn[i];j++) { if(i<lenn) { if(flag||(j==9&&numn[i+1]==4)) { res+=dp[i][j][0]; } } res+=dp[i][j][1]; } if(i<lenn) { if(numn[i]==9&&numn[i+1]==4) { flag=1; } } } return res; } int check() { for(int i=lenn;i>0;i--) { if(i<lenn) { if(numn[i+1]==4&&numn[i]==9) { return 1; } } } return 0; } int main() { // freopen("in.txt","r",stdin); int t; scanf("%d",&t); memset(dp,0,sizeof(dp)); work(); while(t--) { scanf("%I64d",&n); cal(); printf("%I64d\n",solve()+check()); } return 0; }
相关文章推荐
- HDU-3555-数位DP-Bomb
- HDU-3555 Bomb (数位dp 入门题)
- 【数位dp】hud 2089 不要62 hdu 3555 Bomb
- HDU 3555 Bomb(数位DP)
- HDU 3555 Bomb(数位dp&记忆化搜索)
- hdu 3555 Bomb 数位DP
- hdu3555——Bomb(数位dp)
- HDU 3555 Bomb 数位dp
- HDU 3555 Bomb 数位DP 入门
- HDU 3555 Bomb(基础数位dp)
- HDU 3555 Bomb (数位DP)
- HDU 3555 Bomb 基础数位dp
- HDU 3555 Bomb (数位DP)
- HDU 3555 Bomb 数位DP
- HDU 3555 Bomb(数位DP)
- HDU-3555 Bomb 数位DP
- HDU - 3555 bomb(数位DP) HQG_AC的博客
- HDU-3555-Bomb(数位DP)
- hdu 3555 Bomb(数位dp)
- HDU - 3555 Bomb(数位dp)