首页 > 其他 > 详细

HDU 2089:不要62(数位DP)

时间:2014-03-13 22:34:51      阅读:456      评论:0      收藏:0      [点我收藏+]

类型:数位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;

代码:

bubuko.com,布布扣
#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;
}
bubuko.com,布布扣

HDU 2089:不要62(数位DP),布布扣,bubuko.com

HDU 2089:不要62(数位DP)

原文:http://www.cnblogs.com/shinecheng/p/3599268.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!