DP小結
DP本質就是狀態壓縮——只記錄和答案有關的值。
所以DP的解法大概就是:
①不斷探索問題性質(數位DP體現得比較明顯,如BZOJ1026 windy數,還有一道缺了題號的題)
②減少那些和答案有關的值的個數(比如要從題目中篩選信息來定出狀態,列出方程)。
——scαpe
只是說說而已,DP並沒有什麼定式。
一些方法
這些方法說不定可以提供一些思路[滑稽]。
以下內容完全按照意識流順序出現。
刷表法與填表法
舉個例子來說,就是:
刷表法(也經常在狀態壓縮裏面遇見,也許可以避免初始化):當簡單的狀態不方便表示的時候,可以考慮刷表法,比如 之類的。如 之類的神仙轉移就可以用刷表法。比如一道缺了題號的題。
填表法: 之類。
分解步驟
把一個大的東西分成很多個小塊討論。比如計算一堆鏈的權值和,一條鏈由很多線段構成,可以把每條線段對答案的貢獻單獨提出來算(BZOJ4033 樹上染色);比如求一堆數字的二進制位的 值,可以按位運算,即把這一堆數的某一位提出來單獨運算,最後把答案合起來……
單獨計算枚舉上限
防止時間複雜度退化。具體看題目咯,比如BZOJ4033 樹上染色。
樹形DP常用狀態
狀態中有一維表示以 爲根的子樹。比如BZOJ4033 樹上染色中的狀態 表示以 爲根的子樹中有 個黑點。
兩兩合併子問題(樹形DP)
一棵樹可以有很多兒子,這些兒子又有很多新兒子……(無限遞歸調用)設 爲樹的根,它的 個兒子分別爲 。那麼按順序以如下方式計算:
把+號左邊的部分看做一個整體,右邊看做另一個整體,依次合併。最後一次合併之後就得到了以 爲根的樹的相關值。比如BZOJ4033 樹上染色。
前綴思想(數位DP)
求 中滿足某一特徵的數,可看爲 兩步。
例如:BZOJ1026 windy數 BZOJ1799 self 同類分佈
嵌套DP
一些DP題,一次DP不夠,還要在第一次DP的基礎上再來一波DP。
比如BZOJ2287 消失之物,退揹包問題。
放一篇樹形DP的總結
……
暫時就這些了吧?竟然嗶嗶了這麼多,汗