2022年总结数位DP算法汇编 .pdf
《2022年总结数位DP算法汇编 .pdf》由会员分享,可在线阅读,更多相关《2022年总结数位DP算法汇编 .pdf(6页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、数位 dp 是一种计数用的dp,一般就是要统计一个区间le,ri 内满足一些条件数的个数。比如, 1,10000 中统计不含有4 的数。所谓数位 dp,字面意思就是在数位上进行dp咯。就是对数字每一位每一位递推此类题目最基本的暴力方法:1.for ( int i=le;i=ri;i+) 2.if (Check(i) ans+; 而数位 DP 就是从最低 (高)位起,一位一位的放数字,然后记忆化一下,累加一下有两种方法,一是递推,二是记忆化搜索一,记忆化搜索:思路来自: 数位 dp 总结之从入门到模板假设题目要求是不含有62 的数状态定义: dpospre 表示当前枚举到pos位置,且 pos+
2、1 位的数字是 pre,此时满足题意的数字的个数(也即是 pre=6 时, pos该位置不能放2) 还要个数组 ai保存第 i 位的数字,如213,a0=3,注意是从右往左数有个问题是枚举第pos位数时,此位置放数字的范围要判断一下,比如题目给出在1,894 枚举的时候要判断是否在894 以内比如,213,第一位放了 2,那么第二位就只能放01,所以模板中用了个limit 判断pos前的几位数字是否与n 一样, true 的话只能枚举0apos,false 就是 09,不然比题目要求的213 大了还有个问题是前导0 的问题,假如枚举5 位数,你放的时候前2 位都是 00,那数字不变成 3 位了
3、嘛,所以需要个lead保存前几位是否都是0,当然这是看题意的,有时候题目不要求,可以直接省去好了,看模板:1.typedeflonglong ll; 2.int a20; 3.ll dp20state;/ 不同题目状态不同4.ll dfs(int pos,/*state变量 */ , bool lead/* 前导零 */ , bool limit/* 数位上界变量 */ ) /不是每个题都要判断前导零5. 6./ 递归边界,既然是按位枚举,最低位是0,那么 pos=-1说明这个数我枚举完了7.if (pos=-1) return 1; /* 这里一般返回1,表示你枚举的这个数是合法的,那么这里
4、就需要你在枚举时必须每一位都要满足题目条件,也就是说当前枚举到pos 位,一定要保证前面已经枚举的数位是合法的。不过具体题目不同或者写法不同的话不一定要返回1 */名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 6 页 - - - - - - - - - 8./ 第二个就是记忆化( 在此前可能不同题目还能有一些剪枝)9.if (!limit & !lead & dpposstate!=-1) return dpposstate; 10./* 常规写法都是在没有限制的条件记
5、忆化,这里与下面记录状态是对应,具体为什么是有条件的记忆化后面会讲*/11.int up=limit?apos:9;/ 根据 limit判断枚举的上界up; 这个的例子前面用213 讲过了12. ll ans=0; 13./ 开始计数14.for ( int i=0;i=up;i+)/ 枚举,然后把不同情况的个数加到ans 就可以了15. 16.if () . 17.elseif (). 18. ans+=dfs(pos-1,/* 状态转移 */ ,lead & i=0,limit & i=apos) / 最后两个变量传参都是这样写的19./* 这里还算比较灵活,不过做几个题就觉得这里也是套路
6、了20.大概就是说,我当前数位枚举的数是i ,然后根据题目的约束条件分类讨论21.去计算不同情况下的个数,还有要根据state变量来保证i 的合法性,比如题目22.要求数位上不能有62 连续出现 , 那么就是 state就是要保存前一位pre, 然后分类,23.前一位如果是6 那么这意味就不能是2,这里一定要保存枚举的这个数是合法*/24. 25./ 计算完,记录状态26.if (!limit & !lead) dpposstate=ans; 27./* 这里对应上面的记忆化,在一定条件下时记录,保证一致性,当然如果约束条件不需要考虑 lead ,这里就是lead就完全不用考虑了*/28.re
7、turn ans; 29. 30.ll solve(ll x) 31. 32.int pos=0; 33.while (x) / 把数位都分解出来34. 35. apos+=x%10;/ 个人老是喜欢编号为0,pos),看不惯的就按自己习惯来,反正注意数位边界就行36. x/=10; 37. 38.return dfs(pos-1/* 从最高位开始枚举*/ , /* 一系列状态 */, true , true); / 刚开始最高位都是有限制并且有前导零的,显然比最高位还要高的一位视为0 嘛39. 40.int main() 41. 42. ll le,ri; 43.while (scanf(%
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年总结数位DP算法汇编 2022 总结 数位 DP 算法 汇编
限制150内