DP小結

DP小結

DP本質就是狀態壓縮——只記錄和答案有關的值。

所以DP的解法大概就是:

①不斷探索問題性質(數位DP體現得比較明顯,如BZOJ1026 windy數,還有一道缺了題號的題

②減少那些和答案有關的值的個數(比如要從題目中篩選信息來定出狀態,列出方程)。

——scαpe

只是說說而已,DP並沒有什麼定式。

一些方法

這些方法說不定可以提供一些思路[滑稽]。

以下內容完全按照意識流順序出現。

刷表法與填表法

舉個例子來說,就是:

刷表法(也經常在狀態壓縮裏面遇見,也許可以避免初始化):當簡單的狀態不方便表示的時候,可以考慮刷表法,比如f[i+k]+=f[i] 之類的。如f[i][j]=(@!./)f[i1][j1] 之類的神仙轉移就可以用刷表法。比如一道缺了題號的題

填表法:f[i]=f[i1]... 之類。

分解步驟

把一個大的東西分成很多個小塊討論。比如計算一堆鏈的權值和,一條鏈由很多線段構成,可以把每條線段對答案的貢獻單獨提出來算(BZOJ4033 樹上染色);比如求一堆數字的二進制位的xor,or,and... 值,可以按位運算,即把這一堆數的某一位提出來單獨運算,最後把答案合起來……

單獨計算枚舉上限

防止時間複雜度退化。具體看題目咯,比如BZOJ4033 樹上染色

樹形DP常用狀態

狀態中有一維表示以i 爲根的子樹。比如BZOJ4033 樹上染色中的狀態f[i][j] 表示i 爲根的子樹中有j 個黑點。

兩兩合併子問題(樹形DP)

一棵樹可以有很多兒子,這些兒子又有很多新兒子……(無限遞歸調用)設i 爲樹的根,它的n 個兒子分別爲s1,s2,s3,...,sn 。那麼按順序以如下方式計算:

s1+s2;s1,s2+s3;s1,s2,s3+s4;...;s1,s2,s3...sn1+sn

+號左邊的部分看做一個整體,右邊看做另一個整體,依次合併。最後一次合併之後就得到了以i 爲根的樹的相關值。比如BZOJ4033 樹上染色

前綴思想(數位DP)

[a,b] 中滿足某一特徵的數,可看爲[1,b][1,a1] 兩步。

例如:BZOJ1026 windy數 BZOJ1799 self 同類分佈

嵌套DP

一些DP題,一次DP不夠,還要在第一次DP的基礎上再來一波DP。

比如BZOJ2287 消失之物退揹包問題

一篇樹形DP的總結
……

暫時就這些了吧?竟然嗶嗶了這麼多,汗

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章