hdu4278Faulty Odometer 数位dp

//一个数n为从1到n的数中每一位的数为3或者8时
//跳过,如15229的下一个数为15240
//问其实际的数为多少
//直接数位dp就行
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
using namespace std ;
const int maxn = 20 ;
int dp[maxn] ;
int bit[maxn] ;
int dfs(int pos , int lim)
{
    if(pos == 0)
    return 1 ;
    if(dp[pos]!=-1 && !lim)
    return dp[pos] ;
    int num = lim ? bit[pos] : 9 ;
    int ans = 0 ;
    for(int i = 0;i <= num;i++)
    if(i != 3 && i != 8)
        ans += dfs(pos-1 , (i==num)&&lim)  ;
    if(!lim)dp[pos] = ans ;
    return ans ;
}
int main()
{
    int n ;
    memset(dp , -1 , sizeof(dp)) ;
    while(scanf("%d" , &n) && n)
    {
        int tmp = n ;
        int step = 0 ;
        while(tmp)
        {
            bit[++step] = tmp%10 ;
            tmp /= 10 ;
        }
        printf("%d: %d\n" , n , dfs(step , 1)-1) ;
    }
    return 0 ;
}


你可能感兴趣的:(hdu4278Faulty Odometer 数位dp)