数位dp小结

在这里写个总结吧……
对于数位dp,之前学的时候,学得很唬,现在又学了一发,还是感觉这个东西不是很好掌控.这个东西有他的思想,当然也有一定的套路和模板,我大概可以掌握模板,了解了一些套路,对他的思想也有了一些认识.虽然说思想是根本,但是掌握套路和模板也是必不可少的,不过只知道套路和模板对于一些比较活的题还是很无力的.反正这次做的题都可以自己独立地做出来,感觉大概可以体会这个东西了.
PS:数位dp这个东西有时候也会融入一些其他算法的思想或者其他方面的思想,从而在一定程度上打破模板和套路.
我做过的这些题都是数字区间统计问题,做题的时候大体上就是:
  I.先想状态定义(这玩意无论是dp还是记忆化搜索总要有个状态,例外的话,到现在还没有遇见过)
    1.看一看前导0该怎么处理
    2.按照题意,该记录什么
    3.如果状态定义有了思路
      (1).看看自由选数的数位该怎么转移
      (2).看看有限制的数位怎么转移
      (3).看看MLE吗
    PS:这个东西一般都会有一维表示数位,并且一般还会有一维表示是否加入量上界的限制( 记忆化搜索的时候,有上界限制的状态并不用记忆化,因为每个有上界限制的状态都只会被访问一次)
  II.具体怎么实现,是不是要预处理什么
  PS:对于大多数数位dp都是从后往前(从低位到高位)递增,因为这样在卡上界的时候一般都可以做到O(1)get后面自由选数的数位的贡献,但是从前往后(从高位到低位)递增也不是不可以,bzoj3326我就是这样,但是因为这样卡上界的时候后面自由选数的数位的贡献需要O(位长)来get,我就写了一个矩乘.
借用达哥的话:
  数位DP三大核心思想:1.区间求和转化为前缀和相减2.逐位确定3.不对拍基本要完
达哥的话,作为参考吧,是很有道理的,不过我觉得应该加上一条 4.按照数的位数来递增转移.
数位dp一开始是达哥给讲的,所以一开始打数位dp就一直信仰纯dp……等到后来再打数位dp的时候,就开始信仰记忆化搜索,后来发现dfs与dp完美结合才是王道……
现在实现的话,dp不怎么熟悉,一般都记忆化搜索.
这次做题的一个很大的缺陷就是懒得自己写暴力对拍,而是去网上挖标程来对拍……以后注意吧……
PS:这个东西一般一道题打法很多,自己A掉之后,去网上学习一下别人的做法或打法是很有收获的.

列一下我刷过的题:
bzoj1833:[ZJOI2010]count 数字计数
bzoj1026:[SCOI2009]Windy数
bzoj3131:[SDOI2013]淘金
以上三道题是联赛之前做的,当时学数位dp学得唬得一笔,只是大概知道数位dp是个什么东西,而且还信仰纯dp.
好像在之前联赛模拟赛上还做过两道数位dp,不过还是很唬……
现在为了巩固一下,我就继续做了下面的题,感觉好多了.
·bzoj3598:[SCOI2014]方伯伯的商场之旅 **
反正就是对于最终落到哪儿进行操作,不管是dfs还是dp,大体上就是枚举落点或者转移落点,后者比前者不知道快到哪里去了
这个代码很漂亮https://www.cnblogs.com/MashiroSky/p/6399095.html
·bzoj4521:[CQOI2016]手机号码 *不难,但是写傻了挺烦人,写好了贼爽
dp好像比dfs快好多的样子
这个代码很漂亮http://blog.csdn.net/dropd/article/details/51137299
·bzoj1236:SPOJ1433 KPSUM *水题,虽然我很水地水过了,但是我好像没有把这道题的相关性质推到最后,不过我觉得我对于最后一位的单独处理还是很值得以后借鉴的
·bzoj3780:数字统计 *水数位dp+二进制高精(竟然忘了给二进制高精压位,然而却打了一个bitset……)
出错都是在高精……返回值类型错、附初值当成赋值错、输出多出0错、减法减过了错……菜死……
·bzoj2713:[Violet2]愚蠢的副官 **挺套路的思路,就是枚举乘积,把问题转化为求小于等于某个数而乘积为某个数的数的个数,这个很好求,有一个很神奇很有效的减枝,就是乘积小于等于原数,这个在预处理和计算的时候都可以用(似乎还有用2,3,5,7四个质数来搞的,然而和我的思路只是在求出所有乘积的时候不同)
·bzoj3326:[SCOI2013]数数 ***
做法1:我的题解http://www.cnblogs.com/TSHugh/p/8475491.html
做法2:清晰的题解http://blog.csdn.net/fsahfgsadhsakndas/article/details/54948635
(这个f[i][1]的定义对我来说却是比较新颖,和记忆化搜索有点像,而且他n,m两个数组的用法也很不错)
做法3:http://blog.csdn.net/qq_30401759/article/details/50674546
以上三个做法跑起来差不多,相比之下我的比较慢……
·bzoj1799:[Ahoi2009]self 同类分布 *不难,只不过别老是想着全局记忆化,分开记忆化也许更好呢?比如这道题.其实也可以说是发现局部状态互相独立后利用局部记忆化简化了状态,节省了空间.我觉得之后的解释更加合理.
·bzoj3652:大新闻 **我的题解http://www.cnblogs.com/TSHugh/p/8476934.html

posted @ 2018-02-27 09:51  TS_Hugh  阅读(414)  评论(0编辑  收藏  举报