hdu 3555 数位DP

找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
",calc(n));
    }
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/cherryMJY/p/6861492.html