HDU 2089:不要62(数位DP)

类型:数位DP

题意:定义一个好的数为 没有出现“4”和“62” 这样的数。问[n,m]之间有多少这样的数。(0<n≤m<1000000)

思路:

简单的数位DP

定义状态

dp[i][d]为 d开头的i位数中 好数的个数

dp[i][d] = sum(dp[i-1][0,1,3,5~9]) + (d!=6)*(dp[i-1][2]);

出口:dp[1][0~9] = 1;

代码:

#include <cstdio>
#include <cstring>

int dp[15][10];
int num[120];

int dfs(int i, int now, bool iscount) 
{
    if (!iscount && dp[i][now] != -1) return dp[i][now];
    if (i == 1) {
        if (now == 4) return dp[i][now] = 0;
        else return dp[i][now] = 1;
    }
    int end = iscount?num[i-1]:9;
    int ans = 0;
    for (int d = 0; d <= end; d++) {
        if ((now == 6 && d == 2) || d == 4) continue;
        ans += dfs(i-1, d, iscount && d == end);
    }
    if (!iscount) dp[i][now] = ans;
    return ans;
}

int cal(int x) {
    int len = 0;
    while (x) {
        num[++len] = x%10;
        x /= 10;
    }
    return dfs(len+1, 0, 1);
}

int main(){ 
    int n, m;
    while (scanf("%d%d", &n, &m) != EOF) {
        if (n == 0 && m == 0) return 0;
        memset(dp, -1, sizeof(dp));
        printf("%d\n", cal(m)-cal(n-1));
    }
    return 0;
}

 

posted on 2014-03-13 20:20  ShineCheng  阅读(154)  评论(0编辑  收藏  举报

导航