动态规划——数位统计dp

acwing338.计数问题

cpp 复制代码
#include<iostream>
#include<cmath>

using namespace std;

int a, b;

int count(int n, int x) //统计从1到n中x的个数
{
    int res = 0;
    int l, r;
    int cnt = 0;
    int m = n;
    
    while(m)
    {
        cnt ++ ; //存储数字n的位数
        m /= 10;
    }
    
    for(int i = 1; i <= cnt; i ++ )
    {
        //以abcdefg为例来看,现在是计算第四位上x的次数,那么现在i=4

        //先计算最高三位为000~abc-1的情况
        r = pow(10, i - 1); //d右边可取到000~999共power10(i-1)个数
        l = n / (r * 10); //d左边可取到000~abc-1共abc种情况,if(x==0)则为001~abc-1共abc-1种
        //abc=n/power10(i)=n/(r*10);

        
        if(x) res += l * r;
        else res += (l - 1) * r;
        
        int d = (n / r) % 10; // n/r=abcd;abcd%10=d;
        //再计算高三位等于abc的情况(只需考虑d>=x,因为d<x就不符合条件)
        if(d == x) res += n % r + 1; //前四位abcd均相同,后三位可取0~efg共efg+1种,efg+1=n%power(i-1)+1=n%r+1;
        else if(d > x) res += r; //此时后三位可取000~999共power10(i-1)种
    }
    return res;
}

int main()
{
    while(cin >> a >> b, a || b)
    {
        if(a > b) swap(a, b);
        
        for(int i = 0; i < 10; i ++ )
            cout << count(b, i) - count(a - 1, i) << " ";
        
        cout << endl;    
    }
    return 0;
}
相关推荐
6Hzlia5 分钟前
【Hot 100 刷题计划】 LeetCode 1143. 最长公共子序列 | C++ 二维DP 与 哨兵技巧
c++·算法·leetcode
Allen_LVyingbo13 分钟前
《狄拉克符号法50讲》习题与解析(下)
算法·决策树·机器学习·健康医疗·量子计算
豆沙糕14 分钟前
大模型面试高频题:请详细讲解检索中的BM25算法
人工智能·算法
不才小强15 分钟前
查找算法详解:二分查找
数据结构·算法
君义_noip18 分钟前
信息学奥赛一本通 4164:【GESP2512七级】学习小组 | 洛谷 P14922 [GESP202512 七级] 学习小组
学习·算法·动态规划·gesp·信息学奥赛
MicroTech202518 分钟前
微算法科技(NASDAQ :MLGO)面向区块链的系统的高效反量子晶格盲签名技术
科技·算法·区块链
W230357657327 分钟前
0-1 背包进阶:回溯法(子集树)+ 分支限界优化 极致详解(C++ 完整实现)
动态规划·回溯·算法设计·0-1背包
yuan1999733 分钟前
OpenCV ViBe 运动检测算法实现
人工智能·opencv·算法
人工智能培训1 小时前
如何将高层任务分解为可执行的动作序列?
大数据·人工智能·算法·机器学习·知识图谱
罗湖老棍子1 小时前
Power Strings(信息学奥赛一本通- P1457)
算法·字符串·哈希