您的位置:首页 > 其它

HDU 3555 Bomb 基础数位dp

2013-10-13 13:39 453 查看
题意大致就是说给你一个数n,要你求0~n之间含有49的数的个数

理解题意很简单下面就直接贴代码了

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
__int64 dp[21][4];
int a[1000];
void init()
{
memset(dp,0,sizeof(dp));
dp[0][0]=1;
for(int i=1;i<=20;i++)
{
dp[i][0]=dp[i-1][0]*10-dp[i-1][1];  //不含49的个数
dp[i][1]=dp[i-1][0];                //不含49但是最高位为9
dp[i][2]=dp[i-1][1]+dp[i-1][2]*10;  //含有49的个数
}
}
int main()
{
int n,len;
init();
scanf("%d",&n);
while(n--)
{
len=0;
__int64 m,ans=0,flag=0;
scanf("%I64d",&m);
m++;
memset(a,0,sizeof(a));
while(m)
{
a[++len]=m%10;
m/=10;
}
int g=0;
for(int i=len;i>=1;i--)
{
ans+=a[i]*dp[i-1][2];      //对于每位先加上含有49的
if(flag)
{
ans+=a[i]*dp[i-1][0];     //如果之前就已经构成了49,那么加上不能构成49的
}
if(!flag && a[i]>4)      //加上最高位为9的,添加一个4进去
ans+=dp[i-1][1];
if(g==4 && a[i]==9)
flag=1;
g=a[i];
}
printf("%I64d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: