首页 > 其他 > 详细

洛谷 P2602 [ZJOI2010]数字计数

时间:2018-11-04 20:19:53      阅读:97      评论:0      收藏:0      [点我收藏+]

题意简述

求l~r之间0,1...9各出现了几次

题解

数位DP

代码

#include <cstdio>
#include <cstring>
typedef long long ll;
int cnt;
int num[20];
ll l, r, res, _sum;
ll dp[20][20];
ll dfs(int len, int sum, bool limit, bool lead, int x)
{
    ll s = 0;
    if (len == 0) return sum;
    ll& dp = ::dp[len][sum];
    if (!limit && !lead && ~dp) return dp;
    int mx = limit ? num[len] : 9;
    for (register int i = 0; i <= mx; ++i)
    {
        if (!x) _sum = sum + (!i && !lead);
        else _sum = sum + (i == x);
        s += dfs(len - 1, _sum, limit && (i == mx), lead && !i, x);
    }
    if (!limit && !lead) dp = s;
    return s;
}
ll solve(ll x, int y)
{
    cnt = 0;
    memset(dp, -1, sizeof(dp));
    while (x) {num[++cnt] = x % 10; x /= 10; }
    return dfs(cnt, 0, 1, 1, y);
}
int main()
{
    scanf("%lld%lld", &l, &r);
    for (register int i = 0; i < 10; ++i)
        printf("%lld%c", solve(r, i) - solve(l - 1, i), i ^ 9 ? ' ' : '\n');
}

洛谷 P2602 [ZJOI2010]数字计数

原文:https://www.cnblogs.com/xuyixuan/p/9905425.html

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