数位 DP 学习笔记
因为 ABC 考了一次,而且放在 C 题,所以特地来学习一下。
适用范围
数位 DP 的题目好像不太容易考,但是一旦考了数位 DP 就可以愉快地套板子了。
数位 DP 的题目一般长这个样子:
给定整数
其中,
然后数据范围特别大,一般是
还是比较容易识别的。
解决问题
对于数位 DP,解决方式一般是套板子。
考虑将原式化为:
运用前缀和的思想就可以明白。
对于求
考虑设置哪些状态。
pos
首先,我们既然需要一位一位地填数字,必然需要一个状态
lst / sum
第二个状态根据题目来定。
如果题目是求数字各数位间关系,那么显然存上一个数位用的数字
如果题目是求数字各数位的和之类的问题,那么就需要用一个
limit
然后还需要一个状态来约束搜索的范围,将其称为
为什么需要它?它有什么用?
考虑一个例子:
在这个例子里面,打比方说,假如我们已经搜索到了这个位置:
接下来
现在前
所以当前位需要收到
现在显然了,如果没有
lead
最后,肯定需要一个东西来判断前导
题目里一般都会说:不计入前导
其中,
有时,有无前导
接着开始搜索。
首先,如果我们已经搜完所有的数位,必然需要结束。此时即
这时直接返回,如果求个数就是
接着,记忆化搜索必然需要记忆。如果记忆过了,那么就可以结束了。
其中,
第三步,寻找搜索上界。显然,如果前面搜完了即
下界显然是
对于每个数码,进行判断,如果满足条件才能继续搜下一位。
本文作者:zhengtuodu
本文链接:https://www.cnblogs.com/zhengtuodu/p/18674734
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步