在這裡寫個總結吧……
對於數字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,大體上就是列舉落點或者轉移落點,後者比前者不知道快到**去了
這個**很漂亮
·bzoj4521:[cqoi2016]手機號碼 *不難,但是寫傻了挺煩人,寫好了賊爽
dp好像比dfs快好多的樣子
這個**很漂亮
·bzoj1236:spoj1433 kpsum *水題,雖然我很水地水過了,但是我好像沒有把這道題的相關性質推到最後,不過我覺得我對於最後一位的單獨處理還是很值得以後借鑑的
·bzoj3780:數字統計 *水數字dp+二進位制高精(竟然忘了給二進位制高精壓位,然而卻打了乙個bitset……)
出錯都是在高精……返回值型別錯、附初值當成賦值錯、輸出多出0錯、減法減過了錯……菜死……
·bzoj2713:[violet2]愚蠢的副官 **挺套路的思路,就是列舉乘積,把問題轉化為求小於等於某個數而乘積為某個數的數的個數,這個很好求,有乙個很神奇很有效的減枝,就是乘積小於等於原數,這個在預處理和計算的時候都可以用(似乎還有用2,3,5,7四個質數來搞的,然而和我的思路只是在求出所有乘積的時候不同)
·bzoj3326:[scoi2013]數數 ***
做法1:我的題解
做法2:清晰的題解
(這個f[i][1]的定義對我來說卻是比較新穎,和記憶化搜尋有點像,而且他n,m兩個陣列的用法也很不錯)
做法3:
以上三個做法跑起來差不多,相比之下我的比較慢……
·bzoj1799:[ahoi2009]self 同類分布 *不難,只不過別老是想著全域性記憶化,分開記憶化也許更好呢?比如這道題.其實也可以說是發現區域性狀態互相獨立後利用區域性記憶化簡化了狀態,節省了空間.我覺得之後的解釋更加合理.
·bzoj3652:大新聞 **我的題解
數字DP小結
download.csdn.net detail u012959992 8892265 一般是求小於等於數字n的某些特徵數字個數,或者是區間 l,r 的之間的某些特徵數字個數,後者一般可以轉換成求差的方式來做。數字處理函式int f int num return dfs pos,s true dig...
數字dp小結
數字dp可不是對於數的每一位進行dp,而是指對於這個數的組成進行dp。對於數的每一位進行dp,只是數字dp的一類題目。題目描述 現在有兩個要求 這是乙個 n n 106 n n leq 10 6 n n 10 6 位的數 不含前導零 相鄰的兩位的差值大於等於 p p 9 p p leq 9 p p ...
數字DP小結
數字dp是用來解決一段區間內,存在多少個數滿足某個數的性質的問題 題目中輸入的數可能會爆int,一般為0 a b 2 10 9 數字dp中處理的是每乙個數的位,而不是這個數的本身 也就是說1024,2024在後面三位在性質上是一樣的,所以dp會儲存這三位的狀態 這樣就節省了時間複雜度 一般來說,數字...