数位 DP 详解
一、基本概念
数位 DP(Digit DP)是一种用于解决数字位相关计数问题的动态规划方法,常用于统计满足特定条件的数字个数。典型应用场景包括:
- 统计区间内包含或不包含某些数字的数的个数
- 统计满足特定位模式的数的数量
- 计算数字位属性的统计值(如数位和)
二、核心思想
- 数位拆分:将数字转换为字符串或数组逐位处理
- 状态压缩:记录前导零、是否受限、前位状态等关键信息
- 记忆化搜索:通过 DP 数组缓存中间计算结果
三、状态设计要素
pos:当前处理的数位位置limit:前面是否已经达到上限pre:前一位数字的值lead:前导零状态- 其他题目特定状态(如数位和、特定标记等)
四、代码模板
以下是基于 C++ 的记忆化搜索模板框架:
int dp[20][2]; // 根据具体题目调整维度
int digits[20];
int dfs(int pos, bool limit, bool lead) {
if (pos == 0) return 1; // 终止条件
if (!limit && !lead && dp[pos][...] != -1)
return dp[pos][...];
int ans = 0;
int up = limit ? digits[pos] : 9;
for (int i = 0; i <= up; ++i) {
if (lead && i == 0) {
ans += dfs(pos - 1, false, true);
} {
ans += (pos - , limit && (i == up), );
}
}
(!limit && !lead) dp[pos][...] = ans;
ans;
}


