【1 月小记】Part 4: 数位 DP - L

news/2026/1/16 21:48:52/文章来源:https://www.cnblogs.com/L-Coding/p/19494174

数位 DP

持续更新中……

一、导言

数位 DP 是一种解决“统计合法数字的个数”一类问题的动态规划方法。

这种数字可以是任意进制的。

这种问题一般具有以下特征:

  1. 最终目的为计数;
  2. 可以用拆位的思想解决;
  3. 统计限制为给定区间;
  4. 上界很大。

基本原理(引用自 OI-Wiki):考虑人类计数的方式,最朴素的计数就是从小到大开始依次加一。但我们发现对于位数比较多的数,这样的过程中有许多重复的部分,例如,从 7000 数到 7999、从 8000 数到 8999、和从 9000 数到 9999 的过程非常相似,它们都是后三位从 000 变到 999,不一样的地方只有千位这一位,所以我们可以把这些过程归并起来,将这些过程中产生的计数答案也都存在一个通用的数组里。此数组根据题目具体要求设置状态,用递推或 DP 的方式进行状态转移。

数位 DP 中通常会利用常规计数问题技巧,比如把一个区间内的答案拆成两部分相减。

二、例题

P2602 [ZJOI2010] 数字计数

这是一道数位 DP 的模板题。

我们充分发扬人类智慧,使用差分思想,发现题意需要转化一下。让求 \([a, b]\) 的数字中,出现了几次某个数字,实际就是求 \([0, b]\) 中出现了几次某个数字,减去 \([0, a - 1]\) 中出现了几次某个数字。

不妨使用记忆化搜索解决此题。搜索函数 DFS 中传入以下参量:

  1. \(pos\),表示当前搜索的数字位数

  2. \(lmt\),表示当前数字是否还在限制范围内。意义:如果 \(lmt\) 为 true,表示当前数字还在限制范围内,接下来可以选择的数字范围是 \([0, num[pos]]\);如果 \(lmt\) 为 false,表示当前数字已经超出了限制范围,接下来可以选择的数字范围是 \([0, 9]\)

  3. \(sum\),表示当前数字中出现了多少个目标数字,相当于对 \([0, num]\) 中的每一位进行统计。

  4. \(zero\),表示当前数字前面是否有零。意义:免去前导零带来的麻烦,即如果 \(zero\) 为 true,表示当前数字前面有零,接下来可以选择的数字范围是 \([1, 9]\);如果 \(zero\) 为 false,表示当前数字前面没有零,接下来可以选择的数字范围是 \([0, 9]\)

  5. \(digit\),表示当前要统计的目标数字。

我们使用 \(f\) 数组记忆化存储状态信息,初始值设为 \(-1\)

搜索边界为 \(pos = 0\),此时返回 \(sum\)

在搜索过程中定义一个结果变量 \(res\)。依次枚举 \([0, 9]\) 中的每一个数字 \(i\),判断当前数字是否在限制范围内,并进行递归搜索。以下是搜索细节:

  1. 如果 \(lmt\) 为 false,且 \(i > num[pos]\),则 break,因为当前数字已经超出了限制范围。

  2. 递归调用 DFS 函数,传入以下参数:

    a. \(pos - 1\),表示搜索下一位数字。

    b. \(lmt \lor (i < num[pos])\),表示当前数字是否还在限制范围内。如果 \(lmt\) 为 true,且 \(i < num[pos]\),则表示当前数字已经超出了限制范围,传入 false;否则传入 true。

    c. \(sum + ((\lnot zero \lor i) \land (i = digit))\),表示当前数字中出现了多少个目标数字。如果 \(zero\) 为 false 或 \(i\) 不为 0,且 \(i\) 等于 \(digit\),则表示当前数字中出现了一个目标数字,\(sum\) 加 1;否则 \(sum\) 不变。

    d. \(zero \land (i == 0)\),表示当前数字前面是否有零。如果 \(zero\) 为 true 且 \(i\) 为 0,则表示当前数字前面有零,传入 true;否则传入 false。

    e. \(digit\),不变。

最后,返回结果 \(res\)

对于输入的两个整数 \(a\)\(b\),写一个函数 work 分解它们的十进制位,并将这些数位存到全局数组 \(num\) 中,随后调用 DFS 函数进行搜索。

代码如下:

#include <bits/stdc++.h>
#define int long long
#define inf LONG_LONG_MAX
#define debug cout << '!';
using namespace std;
int a, b;
int num[20];
int f[20][2][200][2][10];
int DFS(int pos, bool lmt, int sum, bool zero, int digit) {if (pos == 0) return sum;if (f[pos][lmt][sum][zero][digit] != -1) return f[pos][lmt][sum][zero][digit];int res = 0;for (int i = 0; i <= 9; i++) {if (!lmt && i > num[pos]) break;res += DFS(pos - 1, lmt || (i < num[pos]), sum + ((!zero || i) && (i == digit)), zero && (i == 0), digit);}f[pos][lmt][sum][zero][digit] = res;return res;
}
int work(int x, int digit) {int len = 0;while (x) {num[++len] = x % 10;x /= 10;}memset(f, -1, sizeof(f));return DFS(len, 0, 0, 1, digit);
}
signed main() {cin.tie(0) -> sync_with_stdio(0);cin >> a >> b;for (int i = 0; i <= 9; i++) {cout << work(b, i) - work(a - 1, i) << ' ';}return 0;
}

P3413 SAC#1 - 萌数

我们要找出所有萌的数。题意告诉我们,一个数字是萌的,当且仅当它的十进制数码中,存在长度至少为 \(2\) 的回文子串。

但是,我们注意到,一个长度大于 \(2\) 的回文子串内:

  1. 如果这个这个回文子串的长度为偶数,那么它必定包含一个长度严格为 \(2\) 的回文子串;

  2. 如果这个回文子串的长度为奇数,那么它必定包含一个长度严格为 \(3\) 的回文子串。

因此,我们只需要找到所有包含长度为 \(2\)\(3\) 的回文子串的数字即可。

这显然是一道数位 DP,所以我们考虑使用记忆化搜索求解。

DFS 内需要传入的参量有:

  1. \(pos\),表示当前搜到数字的位数;

  2. \(lmt\),表示当前数字的上限;

  3. \(pre1\),表示前一位的数字;

  4. \(pre2\),表示前两位的数字;

  5. \(zero\),表示当前数字是否包含前导零;

  6. \(moe\),表示当前数字是否包含萌的子串。

在 DFS 的过程中,如果一位数码和前一位的数字相同,那么就找到了一个长度为 \(2\) 的回文子串;如果和前两位的数字相同,那么就找到了一个长度为 \(3\) 的回文子串。在找到这样的子串后,我们可以直接返回 true,并将 \(moe\) 设为 true,表示当前数字是萌的。

记得取模。

P13085 [SCOI2009] windy 数(加强版)

比较板子的一题。

与上一题基本一致,但搜索时不用传两个 \(pre\) 变量,而只需判断当前数位与上一位的差与 \(2\) 的关系即可。

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

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

相关文章

2026最新31888标准面料推荐!国内优质面料品牌权威榜单发布,资质与品质双优助力纺织行业高质量发展 - 品牌推荐2026

引言 随着纺织行业的不断发展,面料品质与功能性成为市场关注的焦点,尤其是在校园服饰、运动服饰等领域,对31888标准面料的需求日益增长。然而,行业内产品质量参差不齐、标准执行不到位等问题仍然存在,给下游企业的…

2026年AI智能软硬件开发十大排名权威发布

2026年AI智能软硬件开发领域十大优质服务商深度解析在数字化转型浪潮中&#xff0c;AI智能软硬件开发成为企业提升竞争力的关键。本文将从技术实力、成功案例及服务支持等维度&#xff0c;深入分析十家优质服务商&#xff0c;并重点推荐虎克智能作为行业标杆。如何选择合适的AI…

2025年湖南大学计算机考研复试机试真题(解题思路 + AC 代码)

2025年湖南大学计算机考研复试机试真题 2025年湖南大学计算机考研复试上机真题 历年湖南大学计算机考研复试上机真题 历年湖南大学计算机考研复试机试真题 更多学校完整题目开源地址&#xff1a;https://gitcode.com/u014339447/pgcode 百度一下pgcode 即可查看&#xff0…

2025年华东师范大学计算机考研复试机试真题(解题思路 + AC 代码)

2025年华东师范大学计算机考研复试机试真题 2025年华东师范大学计算机考研复试上机真题 历年华东师范大学计算机考研复试上机真题 历年华东师范大学计算机考研复试机试真题 更多学校完整题目开源地址&#xff1a;https://gitcode.com/u014339447/pgcode 百度一下pgcode 即…

吴恩达深度学习课程五:自然语言处理 第二周:词嵌入(一)词汇表征和类比推理

此分类用于记录吴恩达深度学习课程的学习笔记。 课程相关信息链接如下:原课程视频链接:[双语字幕]吴恩达深度学习deeplearning.ai github课程资料,含课件与笔记:吴恩达深度学习教学资料 课程配套练习(中英)与答案…

实用指南:glTF PBR材质 / 3ds Max设置导入导出glb/gltf

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

一款专为 WinUI XAML 设计的快速原型设计工具,生成的代码可轻松复制到Visual Studio中!

前言 今天大姚给大家分享一款专为 WinUI XAML 设计的快速原型设计工具,生成的代码可轻松复制到 Visual Studio 中:XAML Studio。 XAML Studio 工具介绍 XAML Studio 是一款专为 WinUI XAML 设计的快速原型设计工具,…

nodejs基于JavaScript的礼物赠送系统_0v80400r

目录系统概述核心功能技术实现部署与扩展性能优化项目技术支持可定制开发之功能亮点源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作系统概述 Node.js基于JavaScript的礼物赠送系统是一个轻量级、高效的Web应用&#xff0c;利用JavaScript全…

10 个常用在线简历制作网站体验对比,新手也能快速上手

历不是写出来的&#xff0c;是“被读出来的”&#xff1a;10 个常用简历网站体验与评分 找工作第一步是简历&#xff0c;但真正让人头大的&#xff0c;往往不是写经历&#xff0c;而是排版、结构和内容怎么搭配。 尤其是实习生和大学生&#xff0c;内容本就不多&#xff0c;一…

Springboot《非遗之美》非物质文化遗产系统 Web项目开发可视化大屏_459w5ar6

目录项目概述技术架构核心功能创新亮点应用价值项目技术支持可定制开发之功能亮点源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作项目概述 《非遗之美》非物质文化遗产系统是一个基于SpringBoot的Web项目&#xff0c;聚焦于非物质文化遗产…

函数指针数组

#include <stdio.h>// 加法 int addition(double num1, double num2, double *res); // 减法 int subtraction(double num1, double num2, double *res); // 乘法 int multiplication(double num1, double num2,…

2026国内最新纯棉绣花面料品牌top10推荐!广东广州等地优质纯棉绣花面料企业权威榜单发布,品质工艺双优助力服饰升级国内 - 品牌推荐2026

随着消费升级与服饰个性化需求的持续增长,纯棉绣花面料作为兼具自然质感与艺术性的核心材料,市场需求呈现年均15%的增长态势。然而行业存在工艺水平参差不齐、花型设计同质化、交付周期不稳定等问题,据中国纺织工业…

瑞芯微(EASY EAI)RV1126B 车辆检测

1. 车辆检测简介 车辆检测是一种基于深度学习的对人进行检测定位的目标检测&#xff0c;能广泛的用于园区管理、交通分析等多种场景&#xff0c;是违停识别、堵车识别、车流统计等多种算法的基石算法。 本车辆检测算法在数据集表现如下所示&#xff1a; 基于EASY-EAI-Nano-TB…

基于改进遗传算法的配电网故障定位Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 &#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室 &#x1f447; 关注我领取海量matlab电子书和数学建模资料 &#…

springboot大学生课程提醒系统_1fj8z5gv

目录系统概述技术架构核心功能创新亮点应用价值项目技术支持可定制开发之功能亮点源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作系统概述 SpringBoot大学生课程提醒系统是一款基于SpringBoot框架开发的校园应用&#xff0c;旨在帮助大学生…

2026最新冲锋衣面料推荐!国内优质冲锋衣面料权威榜单发布,品质功能双优助力户外服饰升级冲锋衣面料推荐 - 品牌推荐2026

引言 随着户外服饰市场的蓬勃发展,冲锋衣作为功能性服装的代表,其面料的性能与品质成为消费者和品牌方关注的核心。然而,市场上面料质量参差不齐、功能标注模糊等问题,给采购者带来了诸多困扰。据中国纺织工业联合…

别一上来就 DFS:聊聊「以图判树」背后的算法直觉(Graph Valid Tree)

别一上来就 DFS:聊聊「以图判树」背后的算法直觉(Graph Valid Tree) 大家好,我是 Echo_Wish。 今天我们聊一道看起来像图论、实际上很“做人”的算法题—— 👉 以图判树(Graph Valid Tree)。 这题在 LeetCode、面试、算法训练营里都属于高频老熟人。 但我发现一个很有…

亲测好用10个AI论文网站,专科生搞定毕业论文必备!

亲测好用10个AI论文网站&#xff0c;专科生搞定毕业论文必备&#xff01; AI 工具如何让论文写作变得轻松高效 在当今这个信息爆炸的时代&#xff0c;AI 工具已经成为学术写作中不可或缺的助手。尤其是对于专科生来说&#xff0c;面对繁重的毕业论文任务&#xff0c;往往感到无…

前端全屏光标闪烁异常排查清单

前端全屏光标闪烁异常排查清单// 检测当前获取焦点的元素 const activeEl = document.activeElement; console.log(当前聚焦元素:, activeEl);// 定义需要显示光标的合法元素类型 const validInputTags = [INPUT, TEXT…

别一听区块链就上来挖矿:聊聊它在智能运维里的“正经用法”

别一听区块链就上来挖矿:聊聊它在智能运维里的“正经用法” 大家好,我是 Echo_Wish。 一个在运维、平台、系统稳定性这条线上打滚多年的老运维。 今天这个话题,可能会让不少运维同学下意识皱眉: 区块链?那不是金融、币圈、Web3 才玩的东西吗?跟运维有啥关系? 说实话,…