您的位置:首页 > 其它

hdu3555 Bomb 数位DP入门

2013-09-19 19:49 447 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3555

简单的数位DP入门题目

思路和hdu2089基本一样

直接贴代码了,代码里有详细的注释

代码:

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
using namespace std;
long long int dp[30][3];
void init()
{
dp[0][0]=1;dp[0][1]=0;dp[0][2]=0;
for(int i=1;i<30;i++)
{
dp[i][0]=dp[i-1][0]*10-dp[i-1][1];//dp[i][0]表示长度为i的不含49的数的个数
dp[i][1]=dp[i-1][0];//dp[i][1]表示长度为i的不含49且最高位为9的数的个数
dp[i][2]=dp[i-1][2]*10+dp[i-1][1];// dp[i][2]表示长度为i的含49 的数的个数
}
}
int bit[30];
long long int solve(long long int n)
{
int len=1;
while(n)
{
bit[len++]=n%10;
n/=10;
}
bit[len]=0;
long long int ans=0;
bool flag=0;
for(int i=len;i>=1;i--)
{
ans+=dp[i-1][2]*bit[i];
if(flag) ans+=dp[i-1][0]*bit[i];//如果高位已经出现49那么后面随意
if(flag==0 && bit[i]>4) ans+=dp[i-1][1];
if(bit[i+1]==4 && bit[i]== 9) flag=1;

}
if(flag ) ans++;
return ans;
}
int main()
{
int t;
long long int n;
scanf("%d",&t);
init();
while(t--)
{
scanf("%I64d",&n);

cout<<solve(n)<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: