狀壓DP
Last updated
Was this helpful?
Last updated
Was this helpful?
貌似有人叫他位元DP,不要跟數位DP搞混了喔。(個人比較常叫他狀壓DP)
狀壓 DP,全名叫做狀態壓縮,簡單來說就是把狀態壓縮在整數裡面。最常見的是壓縮成二進制整數。這篇我們只考慮壓縮成二進制整數的作法。
這個就是最基本的二進制壓縮 DP。主要就是利用二進制代表一個集合選或不選的狀態。
一個常用的狀態設計: 令為當前狀態 (一個二進制整數) = 中 的數量 代表前 個人狀態是 的答案
而轉移的過程大多是由 去更新
小補充
有一些原本是 的枚舉可以用狀壓 DP 壓成
小技巧:狀態可以加入 lowbit 作限制
題目簡單但細節頗
計算簡單環個數
上面的狀態轉移是利用 中 的個數去轉移,而這個做法則是利用 的所有子集去進行轉移。
最常見作法:先枚舉 ,然後對每一個數再去枚舉他的子集。枚舉子集可以直接用 DFS 或者是下面的炫泡 for 迴圈寫法。個人比較推薦 for 迴圈,因為常數很小而且又好寫。
子集枚舉 for 迴圈版本:
值得注意的是這樣子的做法複雜度是 ,而不是
複雜度證明:
按層轉移