HDU 3555 Bomb

Posted on 2016-12-22 15:56  ziliuziliu  阅读(99)  评论(0编辑  收藏  举报

RT.

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
long long t,n,bit[22],ret=0,dp[22][10][2];
void get_bit(long long x)
{
    ret=0;
    while (x) {bit[++ret]=x%10;x/=10;}    
}
long long dfs(long long pos,long long pre,bool flag1,long long flag2)
{
    if (!pos) return flag1;
    if ((!flag2) && (~dp[pos][pre][flag1])) return dp[pos][pre][flag1];
    long long ans=0,up=flag2?bit[pos]:9;
    for (long long i=0;i<=up;i++)
        ans+=dfs(pos-1,i,flag1|((pre==4) && (i==9)),flag2&&i==up);
    if (!flag2) dp[pos][pre][flag1]=ans;
    return ans;
}
int main()
{
    memset(dp,-1,sizeof(dp));
    scanf("%lld",&t);
    for (long long i=1;i<=t;i++)
    {
        scanf("%lld",&n);
        get_bit(n);printf("%lld\n",dfs(ret,0,0,1));
    }
    return 0;
}