HDU 3555 Bomb

本题求一个数包含49的个数,典型数位DP问题。

状态表示:\(f[len][state]\):当前为第len位,当前已统计的数字的状态为state。

其中,state有\(0,1,2\)三种值:

  1. state == 1,表示上一位为4
  2. state == 2,表示高位已存在49
  3. state == 0,其他情况
LL f[20][3];
int a[20];
LL n;

LL dfs(int len,int state,bool limit)
{
    if(!len) return state==2;
    if(!limit && ~f[len][state]) return f[len][state];

    int num=limit?a[len-1]:9;
    LL res=0;
    for(int i=0;i<=num;i++)
    {
        if(state == 2 || (state == 1 && i == 9))
            res+=dfs(len-1,2,limit&&i==num);
        else
            res+=dfs(len-1,i==4,limit&&i==num);
    }

    if(!limit) f[len][state]=res;
    return res;
}

LL dp(LL n)
{
    int len=0;
    while(n)
    {
        a[len++]=n%10;
        n/=10;
    }
    return dfs(len,0,1);
}

int main()
{
    memset(f,-1,sizeof f);

    int T;
    cin>>T;
    while(T--)
    {
        cin>>n;
        cout<<dp(n)<<endl;
    }
    //system("pause");
    return 0;
}
posted @ 2021-02-21 10:45  Dazzling!  阅读(28)  评论(0编辑  收藏  举报