板子
?? DP(pos,状态变量...,限制布尔){
if(pos==0)return 1;//一般每次执行到这里时的数是要算入总结果的 不一定是1 根据题目确定
if(!limit&&dp[对应状态]!=-1)return dp[对应状态]; //记忆化搜索
int up = limit?d[pos]:9;//表示如果前面一位有限制 就说明这是擦着区间上界走的 需要返回d[pos] 如果没有限制 说明没临界 返回9
ll a=0;
for(int i=0;i<=up;i++){
if()...
else if()...//针对不同的题目设置不同的变量记录函数
a+=(pos,状态变量...,限制布尔&&i==d[pos]);//如果这两个条件都有再传递
}
if(!limit)dp[状态]=a;//已经求出对应状态值下的结果了 记录下来
return a;
}
所以 数位dp其实就是一种求解有关于l到r有多少个符合条件的数目类似的统计问题的解题思路
一遍遍数字枚举太慢
不如我们根据条件枚举数位
数位dp本质上是记忆化搜索
我们需要在数位上进行递推
把条件筛选融入到数位上的筛选
所以数位dp其实就是一种算法策略可以让我们
记忆化地去搜索我们想要得到的数据结果
我们把这个数位给他拆开一位一位的枚举
根据题目对应的约束条件 设置记录结构
一般把对应长度,其余位数符合什么什么条件的 并且没有限制的数目记录下来
以供我们之后搜到相同的状态重复利用数据
降低搜索分支