用于数位dp 的模式回顾。。。。。
看了几个博客没有自己满意的最终都是看代码。。。
对数位dp的理解:
就是个计数器
数位:指的是以一个数的某一位当主要状态的意思
dp:就是记录状态
而数位dp则就是利用数位的来当记录的状态,然后累加计数;实则为记忆化搜索
如何实现:
首先你要找到状态的联系,简单的说,例如:数位相加能被10整除的数的个数,它们的联系就是单纯的数位相加取余10等于0,这里你必须要想到在还没到达边界时,如何让查百位数是可以利用到十位数的状态,这里就可以想到如果百位数是1的时候十位为i,dp[十位的位置][(1+i)%10]的状态就如i = 1时是查11十的数,实则与查的是i+1就相当于查十位为2的时候有几种出现的可能是一样的因为1+1的2嘛,这个其实就可以在百位为0时查20的时候就吧它状态记录了以后的都不用记录了。。。
现在想到了这个联系就应该开始构建代码了
那该如何构建呢?
此时想好了状态联系,先去数位在一个数组, 从最高位往回递归,用最高你记录的每一个数当边界从上到下就如123百位为1是个边界,记录是否为边界状态,如果是那之后2也是等等,不是就可以从0到9查了,然后就是递归记值在不是限制的情况下大家都一样所以可以在返回时就记录dp【位置】【你的上下联系】状态,相加计算总和就行例如刚才的百位为1时它就等于十位加1一样的状态所以它可以找dfs(位置 - 1, 状态(百位+遍历用的十位)取余10, 上个是否是限制 && 如果是遍历的十位是否遍历到限制了);
完结希望以后不会了看到这个能会。。。。。