数位统计DP——AcWing 338. 计数问题

数位统计DP

定义

数位DP(Digital DP)是一种用于解决与数字的数位相关问题的动态规划算法。它将数字的每一位看作一个状态,通过转移状态来计算满足特定条件的数字个数或其他相关统计信息。

运用情况

  • 统计满足特定条件的数字个数,例如在给定范围内有多少个数字满足某些数位特征。
  • 计算数字的某个数位上的特定统计信息,如出现的数字频率等。
  • 解决与数字排列、组合相关的问题。

注意事项

  1. 数位DP的核心是正确定义状态和状态转移方程。状态的设计要能够简洁地表示问题的特征,并且状态转移要能够准确地反映数字的数位变化。
  2. 注意边界情况的处理,特别是对于最高位和最低位的特殊处理。
  3. 数位DP通常需要进行记忆化搜索或使用动态规划数组来避免重复计算,以提高效率。
  4. 在实际应用中,要根据具体问题的特点选择合适的数位DP方法,并进行适当的优化和剪枝。

解题思路

  • 分析问题,确定需要统计的数字特征或满足的条件。
  • 设计状态,通常使用一个多维数组来表示不同数位上的状态。
  • 定义状态转移方程,描述如何从一个状态转移到另一个状态。
  • 确定初始状态和边界条件。
  • 使用记忆化搜索或动态规划算法来计算状态值。
  • 根据最终的状态值得到问题的答案。

AcWing 338. 计数问题

题目描述

AcWing 338. 计数问题 - AcWing

运行代码

#include <iostream>
#include <vector>
using namespace std;
int power(int x)
{
    int res = 1;
    while(x --) 
res *= 10;
    return res;
}
int get(vector<int> num, int l, int r)
{
    int res = 0;
    for(int i = l; i >= r; i -- ) res = res * 10 + num[i];
    return res;
}
int count(int n, int x)
{
    if(n == 0) return 0;
    vector<int> num;
    while(n)
    {
        num.push_back(n%10);
        n/=10;
    }
    n = num.size();
    int res = 0;
    for(int i = n - 1 - !x; i >= 0; i --)
    {
        if(i < n - 1)
        {
            res += get(num, n - 1, i + 1) * power(i);
            if(x == 0) res -= power(i);
        }
        if(num[i] == x) res += get(num, i - 1, 0) + 1;
        else if(num[i] > x) res += power(i);
    }
    return res;
}
int main()
{
    int a, b;
    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;
}

代码思路

  • power 函数:计算 10 的指定次幂。
  • get 函数:从给定的数字数组中,按照指定的范围(从左到右)提取出一个数字。
  • count 函数:这是核心函数,用于计算给定数字 n 中特定数字 x 出现的次数。它通过将数字 n 转换为数字数组,然后从高位到低位进行分析计算。对于每一位,如果该位小于最高位且不等于 x,则加上前面高位构成的数字乘以 10 的相应次幂;如果该位等于 x,则加上低位数字构成的数加 1;如果该位大于 x,则加上 10 的相应次幂。最后返回总的出现次数。
  • 在 main 函数中:不断读取两个数字 a 和 b,如果都不为 0 则进行处理。通过交换确保 a 小于 b,然后对于数字 0 到 9,分别计算在 b 中出现的次数减去在 a-1 中出现的次数,并输出。

改进思路

  1. 简化计数逻辑:当前的count函数实现较为复杂,它通过手动处理每一位数字来统计特定数字x出现的次数。可以考虑简化这一过程,直接遍历范围内的每个数,统计相应数字出现的次数,这可能使逻辑更清晰。

  2. 避免重复计算:注意到count函数对每个数字xab都独立计算了一次,这导致了很多重复的工作,特别是对于连续的整数序列。可以通过计算每个数字在一个数位上的贡献,然后根据位数累加这些贡献,来减少重复计算。

  3. 使用字符串处理数字:将整数转换成字符串处理,在某些情况下可以使代码更加直观简洁,尤其是在需要频繁操作数字的每一位时。

  4. 预计算 powers of 10:当前power10函数在每次调用时都重新计算10的幂,如果在循环外预先计算好所需的10的幂次方数组,可以提高效率。

  5. 优化输入处理:代码中通过if(a > b) swap(a, b);确保了a<=b,但这个条件检查对于解决问题并非必要,因为统计数字出现的次数并不依赖于a和b的顺序。

  6. 利用STL中的容器和算法:比如,可以使用std::unordered_map来存储每个数字出现的次数,利用标准库提供的函数来简化代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/726560.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

好用的抖音短视频矩阵系统推荐:筷子剪辑,超级编导。抖去推

目前短视频矩阵行业如火如荼&#xff0c;为大家推荐几款比较好用的短视频矩阵系统。 第一款叫做筷子剪辑&#xff0c;由筷子科技开发&#xff0c;网页版应用工具&#xff0c;无需下载安装 主打视频剪辑&#xff0c;支持一键成片&#xff0c;视频发布等&#xff0c;&#xff0…

SAP赋能食品行业,确保安全与品质的双重飞跃

品安全与品质是消费者最关心的问题&#xff0c;也是食品企业的生命线。随着科技的发展和消费者需求的日益多样化&#xff0c;食品行业正面临着前所未有的挑战和机遇。SAP作为全球领先的企业资源规划&#xff08;ERP&#xff09;系统&#xff0c;为食品行业提供了全面的解决方案…

基于STC12C5A60S2系列1T 8051单片机接收串口调试助手发送的固定长度字符串控制单片机的功能

基于STC12C5A60S2系列1T 8051单片机接收串口调试助手发送的固定长度字符串控制单片机的功能 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机串口通信介绍STC12C5A60S2系列1T 8051单片机串口通信的结构基于STC12C5A60S2系列1T 8051单片机串口通信的特殊功能…

21.0docker企业级镜像仓库harbor(vmware 中国团队)

docker企业级镜像仓库harbor(vmware 中国团队) 网站下载harbor软件包 https://github.com/goharbor/harbor 查看软件安装harbor版本需求限制 本地环境需求已满足 点击下载harbor安装包 点击releases根据版本信息下载 下面的在线安装就是docker pull。离线就是下载之后…

Flask新手入门(一)

前言 Flask是一个用Python编写的轻量级Web应用框架。它最初由Armin Ronacher作为Werkzeug的一个子项目在2010年开发出来。Werkzeug是一个综合工具包&#xff0c;提供了各种用于Web应用开发的工具和函数。自发布以来&#xff0c;Flask因其简洁和灵活性而迅速受到开发者的欢迎。…

【Java】已解决java.sql.SQLRecoverableException异常

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决java.sql.SQLRecoverableException异常 在Java的数据库编程中&#xff0c;java.sql.SQLRecoverableException是一个重要的异常&#xff0c;它通常表示一个可以恢复的SQL异常。…

重磅!鹅厂大牛带你30分钟玩转AI智能结对编程!

在大模型时代&#xff0c;人工智能技术的突破性进展正重塑着软件开发的面貌。AI的融入不仅优化了代码编写过程&#xff0c;更开启了智能编程的新纪元&#xff0c;为开发者带来了前所未有的工作效率和创新可能。AI结对编程不仅能够极大提升研发效率&#xff0c;还能通过智能分析…

每月策略会议

周一顾问策略会议&#xff0c;对于企业辅导而言&#xff0c;领导力是可以培训的&#xff0c;而决策力不是靠培训就能达成&#xff0c;是需要反复训练和反思。从最为关心的一个状况出发&#xff0c;去行动才会有结果&#xff0c;有了结果反思我们的假设是否有盲区是否有误才有可…

登录安全分析报告:链家地产

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞 …

一机两用是什么

什么是一机两用&#xff0c;一机两用的解决什么问题&#xff1f; 其实&#xff0c;一机两用就是零信任防泄漏沙箱解决方案。 在国内&#xff0c;很多保密性质较高的企事业单位面临着如何在保证业务流畅和工作效率的同时&#xff0c;确保信息高安全性的挑战。为了应对这个问题&…

VMware Ubuntu 虚拟机网卡消失及解决办法

VMware Ubuntu 虚拟机网卡消失 描述原因查找解决方法 描述 在正常使用过程中重启后发现 VMware Ubuntu 虚拟机中的网卡消失了&#xff0c;使用 ifconfig 查看只能看到本地回环&#xff1a; 原因查找 使用如下命令查看是否和我这边遇到的问题一致的原因。 sudo lshw -c netwo…

微信公众号绑定开发者后端,报错“系统发生错误,请稍后重试”的坑

一、问题描述 在公众号后端填写完基本配置&#xff0c;点击保存&#xff0c;发现提示“系统发生错误&#xff0c;请稍后重试”。联系公众号客服回复&#xff0c;涉及开发内容不给支持-_-|| 二、经多次百度&#xff0c;结合实际尝试&#xff0c;总结解决方案如下&#xff1a;…

SYD881X读取GATT VALUE的长度

SYD881X读取GATT VALUE的长度 现在具体遇到这样一个需要&#xff0c;机器生产后要更新profile&#xff0c;这个只能够通过升级4K来做&#xff0c;但是需要知道profile是否改变了&#xff0c;这个就要知道profile是否改变来决定是否要升级&#xff0c;这里的做法是增加一个函数&…

Jenkins+gitee流水线部署springboot项目

目录 前言 一、软件版本/仓库 二、准备工作 2.1 安装jdk 11 2.2 安装maven3.9.7 2.3 安装docker 2.4 docker部署jenkins容器 三、jenkins入门使用 3.1 新手入门 3.2 jenkins设置环境变量JDK、MAVEN、全局变量 3.2.1 jenkins页面 3.2.2 jenkins容器内部终端 3.2.3 全…

如何选择理想CDN服务商来提升网站性能

在数字时代&#xff0c;网络速度已成为衡量网站成功的关键指标之一。快速加载的网站不仅提升用户体验&#xff0c;还对网站的搜索引擎排名产生显著影响。用户期望网站能够迅速响应其请求&#xff0c;而任何延迟都可能导致用户不满和流失。研究表明&#xff0c;网站加载时间的每…

视觉应用线扫相机速度反馈(倍福CX7000PLC应用)

运动控制实时总线相关内容请参考运动控制专栏,这里不再赘述 1、运动控制常用单位u/s运动控制单位[u/s]介绍_运动控制 unit是什么单位-CSDN博客文章浏览阅读176次。运动控制很多手册上会写这样的单位,这里的u是英文单词unit的缩写,也就是单位的意思,所以这里的单位不是微米…

罚函数的概念及内罚与外罚的理解与应用

罚函数&#xff08;Penalty Function&#xff09;是一种在优化算法中用来处理约束问题的方法。 其基本思想是在目标函数中加入一个罚项&#xff08;penalty term&#xff09;&#xff0c;以此来惩罚违反约束条件的解&#xff0c;从而引导算法寻找满足约束条件的最优解。 具体…

【漏洞复现】金和OA C6 download.jsp 任意文件读取漏洞

免责声明&#xff1a; 本文内容旨在提供有关特定漏洞或安全漏洞的信息&#xff0c;以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步&#xff0c;并非出于任何恶意目的。阅读者应该明白&#xff0c;在利用本文提到的漏洞信息或进行相关测…

ps 科研图文字变清晰

目录 网站 PS 网站 AI照片修复神器&#xff0c;一键模糊图片变清晰 (picwish.cn) PS 用PS快速将一张模糊不清晰的照片变清晰&#xff0c;简单5步就好 - 知乎 (zhihu.com) CrtlJ 滤镜 其他 高反差 半径调2 叠加

深度神经网络工作原理深度神经网络训练过程(Deep Neural Networks)概述应用示例

本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:王文峰…