您的位置:首页 > 其它

HDU-3555-Bomb(数位DP)

2016-08-04 15:31 369 查看
链接:http://acm.hdu.edu.cn/showproblem.php?pid=3555

题意:求1-n中含有49数字的个数;

题解:数位DP

CODE:

#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
long long dp[25][5];
int a[20];
/// dp[i][0] i 不含49
/// dp[i][1] i 含有49
/// dp[i][2] 高位9不含49
long long solve(long long x)
{
long long poi=x;
int len=0;
while(poi)
{
a[++len]=poi%10;
poi/=10;
}
long long ans=0, flag=0;
for(int i=len; i>0; --i)
{
ans+=1LL*dp[i-1][1]*a[i];
if(flag){ans+=1LL*dp[i-1][0]*a[i];continue;}
if(a[i]>4)ans+=dp[i-1][2];
if(i<len && a[i]==9 && a[i+1]==4)flag=1;
}
return ans+flag;
}
int main()
{
int T;
dp[0][0]=1;
for(int i=1; i<20; ++i)
{
dp[i][0]=dp[i-1][0]*10-dp[i-1][2];
dp[i][1]=dp[i-1][2]+dp[i-1][1]*10;
dp[i][2]=dp[i-1][0];
}
cin>>T;
while(T--)
{
long long n;
scanf("%I64d",&n);
cout<<solve(n)<<endl;
}
return 0;
}
/*
10
1000000000000000000
100000
19312489
12481794

3970
1142933
708132
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: