hdu 3555 数位DP

岁酱吖の 提交于 2020-03-05 07:55:21

找0~n 有多少个含有49的数直接DP

dp[i][j][k]  到第 i位  前面一位是j  k是是否含有49了  随便记录一下就可以了

 

#include <iostream>
#include<string.h>
#include<stdio.h>
using namespace std ;

#define ll long long

int dig[20];
ll dp[20][10][2];

ll dfs(int len,int now,int ok,int e)
{
    if(len<0)
        return (ok==1);
    if(!e&&dp[len][now][ok]!=-1)
        return dp[len][now][ok];
    int u=e?dig[len]:9;
    ll ans=0;
    for(int i=0;i<=u;i++)
    {
        if(now==4&&i==9)
            ans=ans+dfs(len-1,i,1,e&&(i==u));
        else
            ans=ans+dfs(len-1,i,ok,e&&(i==u));
    }
    if(!e)
        dp[len][now][ok]=ans;
    return ans;
}
ll calc(ll n)
{
    int cnt=0;
    while(n)
    {
        dig[cnt++]=n%10;
        n=n/10;
    }
    return dfs(cnt-1,0,0,1);
}


int main()
{
    memset(dp,-1,sizeof(dp));
    int t;
    scanf("%d",&t);
    while(t--)
    {
        ll n;
        scanf("%lld",&n);
        printf("%lld\n",calc(n));
    }
    return 0;
}
View Code

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!