码迷,mamicode.com
首页 > 其他好文 > 详细

喵哈哈的日常选数问题

时间:2015-07-27 23:14:44      阅读:238      评论:0      收藏:0      [点我收藏+]

标签:

喵哈哈的日常选数问题
Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others)
Problem Description

喵哈哈村子的TTT同学比较怪,他非常讨厌一类数字,是哪种呢?

就是讨厌那些含有37或者4的数

比如 21379,123485,12379。

但是他并不讨厌928357这个数,因为他即不包含37,也没有4。

现在你[L,R]的区间,问你在这个区间中,最多能够选出多少个TTT同学不讨厌的数呢?
Input

输入两个整数,表示L和R

1 <= L <= R <= 2000000000 。
Output
输出一个整数,表示选出的数的个数
Sample Input

1 10

Sample Output

9

解题思路:数位DP

#include <cstdio>

int DP[15][15];

int solve(int n) {
    int cnt = 0, ans= 0, num[15];
    while (n > 0) {
        num[++cnt] = n % 10;
        n /= 10;
    }
     num[cnt+1] = 0;
    for (int i = cnt; i > 0; i--) {
        for (int j = 0; j < num[i]; j++) {
            if (j != 4 && !(num[i+1] == 3 && j == 7))
            ans += DP[i][j];
        }
        if (num[i] == 4 || (num[i] == 7 && num[i+1] == 3))
            break;
    }
    return ans;
}

int main() {
    int L, R;
    DP[0][0] = 1;
    for (int i = 1; i <= 10; i++)
        for (int j = 0; j < 10; j++)
            for (int k = 0; k < 10; k++)
                if (j != 4 && !(j == 3 && k == 7))
                    DP[i][j] += DP[i-1][k];

    while (scanf("%d%d", &L, &R) != EOF)
        printf("%d\n", solve(R+1) - solve(L));

    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

喵哈哈的日常选数问题

标签:

原文地址:http://blog.csdn.net/kl28978113/article/details/47090755

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!