数位统计DP

数位DP

数位(digit)指的是一个数字中的每一位。例如,对于整数1234来说,它有四个数位,分别是1、2、3和4。在数位统计 DP 中,我们通常将数字拆解成各个数位,并使用这些数位进行状态定义和转移。通过对每个数位进行状态定义和计算,我们可以解决各种数字相关的组合计数问题。

首先声明,我也是第一次涉及数位dp,是个菜鸡,因此只涉及最简单的数位问题。就我举的例子可能比较暴力,纯纯数学上的分类讨论,当然你也可以认为是dp中状态转移方程或者说集合划分的推导~

题目如下:

在这里插入图片描述
注意数据范围,别想着纯暴力~

用例输入输出:

在这里插入图片描述
正常人思路: 暴力遍历一下范围内每一个数,再把每个数的每一位取出来,累计一下即可~时间复杂度少说O(n),千万级别就够呛了,上亿那就死翘翘了必过不了。。
大佬们思路: 假设n=abcdefg,且第d位为1的情况——从0 ~ n这个范围内存在多少个xxx1yyy这样的数据呢?是不是可以粗略地说,有多少个就存在多少个1,至少就d这一位是可以这样统计出所有可能存在的1的一部分的。同理,我们依次假设在n的每一位上,当这一位为1的情况,是不是就可以统计出1~n中所有数据数位上1的情况?同理如果是2 ~ 9呢。是不是就可以统计出1 ~ 9在1 ~ n范围内分别出现多少次了。

在这里插入图片描述
上面count(b,x)-count(a-1,x)用到了前缀和的思想。


再跟着下面的图捋一下思路:

在这里插入图片描述

这里次数的计算和传统的状态转移方程不一样,而是通过简单的数学分析可以直接得出的。就以(1)为例:如果xxx=000~abc-1,是不是说明xxx一定小于abc,也就是说,不论后面efg数位上为什么,都不可能会大于abcdefg,也就是说efg三个数位上可选的组合为000 ~ 999一共1000个数,其实也就是10 ^3。三个位置嘛,每个位置有十种选法,也就是 10 ^3 注意这个指数写法,后面会用到。

假设n是1e8,亿级别的数据,也就9位罢了。十进制也就0 ~ 9十个数字。对于1 ~ n这个范围来说近乎是O(1)的了叭~ 这效率就离谱~

但是,最蚌埠住的就是编写代码了,相当考验思维的清晰程度,里面涉及好几个边界问题。比如:求0在第一位上出现的次数,即count(n,0)的情况,从这个数n的第1位上开始循环的时候就得因为这个特判一下,从第2位开始,即此时abcdefg就得从b这一位开始了。因为想构成数据至少为x0yyyy啥的,0yyyy直接击毙得了,因为总不能出现(-1)yyyy来凑次数叭,就是0;还有,求0在第2(3,4,5…)位上出现的次数呢。也会有边界问题,本来是000 ~ abc,如果d=0的话,前面就至少得从001 ~ abc叭。也就是说相当于(abc+1)*10 ^3(假设为abcdefg)变成了(abc)*10 ^3,少了一个10 ^3。

上面看不明白没关系,结合代码,你就会知道我举得例子多么珍贵了~

C++代码
#include <iostream>
#include <algorithm>
#include <vector>using namespace std;const int N = 10;/*001~abc-1, 999abc1. num[i] < x, 02. num[i] == x, 0~efg3. num[i] > x, 0~999*/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 power10(int x)
{int res = 1;while (x -- ) res *= 10;return res;
}int count(int n, int x)
{if (!n) 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 -- )//对x=0的特判,如果是0首位就跳过,这里本质是对n的每个位置进行处理。{if (i < n - 1){res += get(num, n - 1, i + 1) * power10(i);if (!x) res -= power10(i);//对x=0的特判}if (num[i] == x) res += get(num, i - 1, 0) + 1;else if (num[i] > x) res += power10(i);}return res;//这里得到的就是在1~n中所有数,的所有数位上,值为x的数目之和了
}int main()
{int a, b;while (cin >> a >> b , a){if (a > b) swap(a, b);for (int i = 0; i <= 9; i ++ )//这里十进制就处理0~9这十个数据就行cout << count(b, i) - count(a - 1, i) << ' ';cout << endl;}return 0;
}作者:yxc
链接:https://www.acwing.com/activity/content/code/content/64211/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

如果比赛中遇到,我目前多半是写不出来的,但凡脑袋昏一点都得寄~~如果只能过部分样例,我还不如暴力骗分呢。。||

emmm不过话说回来,多默写两遍这道题,还是可以搏一搏的~~

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电脑设置代理IP,上网怎么使用代理

在我们的日常生活中&#xff0c;代理IP的使用越来越常见。当我们需要隐藏自己的真实IP地址时&#xff0c;代理IP就成为了我们的不二选择。那么&#xff0c;如何设置代理IP来固定上网地址呢&#xff1f;本文将详细介绍代理IP的设置方法以及如何使用代理IP固定上网地址。 一、代…

Failed to connect to github.com port 443 after 21055 ms: Timed out

目前自己使用了梯*子还是会报这样的错误&#xff0c;连接不到的github。 查了一下原因&#xff1a; 是因为这个请求没有走代理。 解决方案&#xff1a; 设置 -> 网络和Internet -> 代理 -> 编辑 记住这个IP和端口 使用以下命令&#xff1a; git config --global h…

Kafka集群调优

一、前言 我们需要对4个规格的kafka能力进行探底&#xff0c;即其可以承载的最大吞吐&#xff1b;4个规格对应的单节点的配置如下&#xff1a; 标准版&#xff1a; 2C4G铂金版&#xff1a; 4C8G专业版&#xff1a; 8C16G企业版&#xff1a; 16C32G 另外&#xff0c;一般来讲…

git 分支的创建与删除

一 创建本地分支 git checkout -b codetwo //创建本地分支 codetwo git branch newcode //创建本地分支newcode创建的分支如下图&#xff1a; 用checkout的方式创建&#xff0c;只是创建的同时还切换到了这个本地分支 二 创建远程分支 git branch newcode //创…

ALPHA开发板烧录工具MfgTool烧写原理

一. 简介 MfgTool 工具是 NXP 提供的专门用于给 I.MX 系列 CPU 烧写系统的软件&#xff0c;可以在 NXP 官网下载到。运行在windows下。可以烧写uboot.imx、zImage、dtb&#xff0c;rootfs。通过 USB口进行烧写。 上一篇文章简单了解了 烧录工具MfgTool &#xff08;针对ALPH…

TrustZone之数据、指令和统一缓存(unified caches)

在Arm架构中,data caches是物理标记(physically tagged)的。物理地址包括该行来自哪个地址空间,如下所示: 对于NP:0x800000的缓存查找永远不会命中使用SP:0x800000标记的缓存行。这是因为NP:0x800000和SP:0x800000是不同的地址。 这也影响缓存维护操作。考虑前面图表中的示…

人工智能学习8(集成学习之xgboost)

编译工具&#xff1a;PyCharm 文章目录 编译工具&#xff1a;PyCharm 集成学习XGBoost(Extreme Gradient Boosting)极端梯度提升树1.最优模型的构建方法XGBoost目标函数案例1&#xff1a;泰坦尼克号案例2&#xff1a;对奥拓集团差评进行正确分类。数据准备&#xff1a;1.第一种…

基于深度学习yolov5行人社交安全距离监测系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介系统工作原理主要组成部分技术实现优势和特点应用场景和前景 二、功能三、系统四. 总结 一项目简介 基于深度学习 YOLOv5 的行人社交安全距离监测系统是一种…

数据仓库与数据挖掘复习资料

一、题型与考点[第一种] 1、解释基本概念(中英互译解释简单的含义)&#xff1b; 2、简答题(每个10分有两个一定要记住)&#xff1a; ① 考时间序列Time series(第六章)的基本概念含义解释作用&#xff08;序列模式挖掘的作用&#xff09;&#xff1b; ② 考聚类(第五章)重点考…

自动化定时发送天气提醒邮件

&#x1f388; 博主&#xff1a;一只程序猿子 &#x1f388; 博客主页&#xff1a;一只程序猿子 博客主页 &#x1f388; 个人介绍&#xff1a;爱好(bushi)编程&#xff01; &#x1f388; 创作不易&#xff1a;如喜欢麻烦您点个&#x1f44d;或者点个⭐&#xff01; &#x1f…

配置端口安全示例

组网需求 如图1所示&#xff0c;用户PC1、PC2、PC3通过接入设备连接公司网络。为了提高用户接入的安全性&#xff0c;将接入设备Switch的接口使能端口安全功能&#xff0c;并且设置接口学习MAC地址数的上限为接入用户数&#xff0c;这样其他外来人员使用自己带来的PC无法访问公…

华为配置风暴控制示例

组网需求 如下图所示&#xff0c;SwitchA作为二层网络到三层路由器的衔接点&#xff0c;需要防止二层网络转发的广播、未知组播或未知单播报文产生广播风 配置思路 用如下的思路配置风暴控制。 通过在GE0/0/1接口视图下配置风暴控制功能&#xff0c;实现防止二层网络转发的…

城市之眼:数据可视化在智慧城市的角色

作为智慧城市建设的核心组成部分&#xff0c;数据可视化扮演着至关重要的角色。在城市中&#xff0c;数据源源不断地产生&#xff0c;涵盖了从交通流量、环境质量到市民需求等各个方面。而数据可视化作为将这些数据呈现出来的手段&#xff0c;对智慧城市的发展起着关键性的作用…

HarmonyOS架构及关键技术整理

技术解析&#xff1a;鸿蒙系统的底层优势 鸿蒙系统采用了先进的微内核设计&#xff0c;这是一种全新的系统架构&#xff0c;能够更好地适应现代智能设备的多样性和互联性。微内核通过最小化系统的核心功能&#xff0c;提高了系统的安全性和可定制性。此外&#xff0c;鸿蒙系统…

多传感器融合SLAM在自动驾驶方向的初步探索的记录

1. VIO的不可观问题 现有的VIO都是解决的六自由度的问题, 但是对于行驶在路面上的车来说, 通常情况下不会有roll与z方向的自由度, 而且车体模型限制了不可能有纯yaw的变换. 同时由于IMU在Z轴上与roll, pitch上激励不足, 会导致IMU在初始化过程中尺度不准以及重力方向估计错误,…

决策树 (人工智能期末复习)

几个重要概念 信息熵&#xff1a;随机事件未按照某个属性的不同取值划分时的熵减去按照某个属性的不同取值划分时的平均 熵。即前后两次熵的差值。 表示事物的混乱程度&#xff0c;熵越大表示混乱程度越大&#xff0c;越小表示混乱程度越小。 对于随机事件&#xff0c;如果它的…

Mysql-全外连接-Union和Union ALL的辨析及练习

mysql不支持FULL JOIN&#xff0c;但是可以用 &#xff08;select 语句1&#xff09; union &#xff08;select 语句2&#xff09;代替 &#x1f436;1. SQL UNION 操作符 UNION 操作符用于合并两个或多个 SELECT 语句的结果集。 请注意&#xff0c;UNION 内部的 SELECT 语句…

计算机图形图像技术(图像锐化处理与图像解析)

一、实验原理&#xff1a; 1、拓展Sobel算子锐化 void Sobel(Array src, Array dst, int ddepth, int dx, int dy, int ksize); ①参数&#xff1a;src为输入图像&#xff1b;dst为输出图像&#xff0c;大小和通道数与源图像一致&#xff0c;必要时重建&#xff1b;ddepth为目…

unity 2d 入门 飞翔小鸟 飞翔动作动画描点(六)

1、创建文件夹新建动画控制器 右键->create->Animator controer 给图层创建动画 把创建后的动画控制器拖拽至对应图层 点击window->Animation->Animation 点击创建文件夹 把图片拖拽到这里面&#xff0c;就可以了 然后我们就看在player看到已经把动作挂上去 点…

ChatGPT文书替代论“热”潮背后的“冷”思考

2022年11月底OpenAI推出的人工智能聊天工具ChatGPT仅推出一周就火爆全球&#xff0c;推出两个月&#xff0c;就在全球范围内坐拥1亿用户&#xff0c;根据华尔街消息&#xff0c;OpenAI目前估值已达290亿美元。 认识ChatGPT ChatGPT是由美国成立的人工智能研究公司OpenAI研究开…