本文目录#
数位 DP 的特点#
处理与数字位数相关的计数问题(例如统计区间内某种属性的数量)。采用按位递归,携带限制条件(前缀是否等于上界)、状态(前导零、数位和、余数等)。
模板结构#
1 | class DigitDP { |
常见应用#
- 统计不含特定数字的数量;
- 计算数字和/积的属性(如数位和模 m = k 的数量);
- 统计 0-9 频次;
- 处理上下界
[L, R]
:结果为solve(R) - solve(L-1)
。
实战技巧#
- 状态设计:根据题目需求定义状态(数位和、是否出现指定数字、前导零等);
- 剪枝:在
transition
中提前判定无效状态; - 记忆化:限制值
limit=0
时才缓存; - 大数:使用
long
或 BigInteger 提取位数。
自检清单#
- 是否正确处理前导零与状态兼容?
- 是否采用
[L,R]
方案,避免重复计算? - 是否在 DFS 中验证状态限制合理?
参考资料#
- CP-Algorithms Digit DP:https://cp-algorithms.com/dynamic_programming/digit_dp.html
- 洛谷数位 DP 题单: https://www.luogu.com.cn/tag/digit-dp
- 《Competitive Programming 3》数位 DP 章节
本作品系原创,采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,转载请注明出处。