首页 > 其他 > 详细

hdu3652(数位dp模板)

时间:2021-03-06 12:52:47      阅读:27      评论:0      收藏:0      [点我收藏+]

问题描述:求1-n内的数中包含49的数的个数,数位dp模板

代码:

#include<iostream>
#include<string.h>
#include<cmath>
#include<set>
#include<map>
#include<string>
#include<queue>
#include<stack>
#include<vector>
#include<bitset>
using namespace std;
typedef long long ll;
inline ll read() {
    ll sum = 0, f = 1;
    char p = getchar();
    for (; !isdigit(p); p = getchar()) if (p == -)f = -1;
    for (; isdigit(p); p = getchar())  sum = sum * 10 + p - 48;
    return sum * f;
}
const int maxn = 50;
ll dp[maxn][10];
ll dig[maxn];
void init() {
    dp[0][0] = 1;
    for (int i = 1; i < maxn; i++) {
        for (int j = 0; j < 10; j++) {
            for (int k = 0; k < 10; k++) {
                if (!(j == 4 && k == 9))
                    dp[i][j] += dp[i-1][k];
            }
        }
    }
}
ll n, len,t;
ll solve(ll n) {
    len = 0;
    ll t = n;
    while (t) {
        dig[++len] = t % 10;
        t /= 10;
    }dig[len + 1] = 0;
    ll res = 0;
    for (int i = len; i >= 1; i--) {
        for (int j = 0; j < dig[i]; j++) {
            if (!(dig[i + 1] == 4 && j == 9))res += dp[i][j];
        }
        if (dig[i] == 9 && dig[i + 1] == 4) {//默认n是满足条件的(solve(n)+1),但是发现不满足,res--
            res--;
            break;}
    }
    return res;
}
int main() {
    //freopen("test.txt", "r", stdin);
    int T = read();
    init();
    while (T--) {
        n = read();
        printf("%lld\n",(n+1)-(solve(n)+1));//求包含49的那就减去不包含49的
        //init()求出的个数数是包含0的
    }
    return 0;
}

 

hdu3652(数位dp模板)

原文:https://www.cnblogs.com/MYMYACMer/p/14490010.html

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