狀壓DP(Bit mask DP)將狀態壓縮為二進位制表示,用於處理狀態複雜的問題。主要分為一維和二維兩種型別。
一維狀壓DP
最經典的是求最短哈密頓路徑,對應 \(n\) 個結點的帶權無向圖,暴力列舉所有情況的時間複雜度為 \(O(n)\),但是我們思考一下,到達某個頂點時,需要記錄在這之前已經走過結點是哪些,但無需記錄走的順序,可以用一個二進位制數表示當前狀態,其中為\(1\)的下標表示已經走過的結點,這樣就只需列舉 \(2^n-1\) 種狀態,同時列舉上一個結點和當前結點進行狀態更新,這樣時間複雜度可降為 \(O(n^2 2^n)\)。
例題:
最短Hamilton路徑
Shuffling Songs
二維狀壓DP
這種型別通常給定一個二維陣列,一行的狀態可以用一個二進位制數表示,從上到下依次轉移下來,此類題目一般需要注意從i開始迴圈防止越界,最後多迴圈一次方便輸出答案,當二維陣列的行和列維度不同時,當行列順序無影響時,可以透過交換列舉順序控制演算法的時間複雜度。
例題:
小國王
玉米田
炮兵陣地