总结一下用记忆化搜索做数位dp的步骤

dfs有4个参数,剩余的位数len,当前的状态pos,前导0标记z(前面是否全是0),限制标记lim(前面是否都取了上限数的对应位置)

首先检查lim和z是否都没有标记上,然后如果dp[len][pos]不是未定义状态的话就可以直接返回啦,但是这个地方有时候不检查z标记好像也能过的样子,不知道为啥,可能跟下面的初始条件定义有关,嘛为了规范不出差错以后还是都加上吧

然后就是初值定义返回了,但是这一步跟上面一步似乎顺序没关系的样子,而且这一步也可以通过在dfs前预先定义初值状态来直接跟上一步合并

再然后就是根据lim标记和所求的上限数的当前位得出当前位可以枚举的最大值,接着就开始枚举当前位进行dp状态转移了

dp状态转移的时候根据不同题目条件要处理好各种细节,有的题目要把z&&i==0的情况单独处理

再之后就差不多结束了,判断lim和z标记是否都没有标记上,是的话就把返回值赋给dp[len][pos],如果忘了这一步的话就会退化成单纯的搜索了哟

最后把计算结果返回= =

没了,我还得接着把最后一道AC自动机的题刷完T.T

你可能感兴趣的:(总结一下用记忆化搜索做数位dp的步骤)