数位dp

之前一直没学懂的知识点。可能因为之前的搜索功底太差,导致一直不会记搜实现。补了一些搜索之后补下之前留下的坑。


关于dp

很明显是与数字组成相关的dp。

一般的题型为

求出在给定区间\([l,r]\)中,符合条件\(f(i)\)的数\(i\)的数的个数。

一般转化为\([0,r]\)和\([0,l-1]\)两段来解决,最后将结果相减。

一般是按位dp,数的大小对复杂度影响不大。

所以经常会出现大得离谱的数,遇到时可以考虑数位dp。


搜索实现

过程

从最高位向下搜,到最低位得到方案数,一层一层向上返回答案并累加,最后从最高位得到答案。

状态

基本量:数字位数\(pos\),答案\(sum\),最高位限制\(lim\),前导零\(led\)。

其它变量就题论题,需要啥设啥…(反正设多了不会出错)。

细节

一.前导\(0\)标记\(led\)

​ \(1.\)如果当前位\(led=1\)且当前位也是\(0\),那么当前位也是前导\(0\)。

​ \(2.\)如果当前位\(led=0\)且当前位不是\(0\),那么本位作为最高位继续搜。

二.最高位标记\(lim\)

这一位标记为\(lim\),这一位能取到的最大值是\(res\),下一位的标记是\(lim\)&&\((i==res)\)。

三.dp值的记录

当\(lim=1\)和\(led=1\)时不能记录和取用dp值。

上一篇:知识点索引:常数项级数


下一篇:[C]选择语句(1/4)→ if语句