您的位置:首页 > 其它

HDU 3555 Bomb(数位dp)

2016-02-23 23:14 357 查看
题目链接:【HDU 3555】

求出1~n(1 <= N <= 2^63-1)数字包含49的有多少个

神奇的数位dp

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;
#define ll __int64
int t, arr[25];
ll dp[25][3];
/*
dp[i][0]:位数为i,没有49
dp[i][1]:9开头的,没有49
dp[i][2]:有49
*/
void init()
{
dp[0][0]=1;
for(int i=1; i<=22; i++)
{
dp[i][0] = dp[i-1][0]*10-dp[i-1][1];
dp[i][1] = dp[i-1][0];
dp[i][2] = dp[i-1][2]*10+dp[i-1][1];
}
}
ll solve(ll x)
{
int len = 0;
while(x)
{
arr[++len] = x%10;
x/=10;
}
arr[len+1] = 0;
ll ans=0, flag=0;
for(int i=len; i>=1; i--)
{
ans += dp[i-1][2]*arr[i];
if(flag) ans+=dp[i-1][0]*arr[i];
if(!flag && arr[i]>4) ans+=dp[i-1][1];
if(arr[i+1]==4 && arr[i]==9) flag=1;
}
return ans;
}
int main()
{
init();
scanf("%d", &t);
while(t--)
{
ll n;
scanf("%I64d", &n);
printf("%I64d\n", solve(n+1));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: