hdu4278Faulty Odometer 数位dp

来源:互联网 发布:淘宝被扣48分如何重开 编辑:程序博客网 时间:2024/05/17 00:02
//一个数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 ;}

0 0
原创粉丝点击