狀態壓縮DP

2021-07-29 08:59:33 字數 969 閱讀 4854

首先,我們以一道狀壓經典題tsp來引入。

tsp問題

一張圖上有n個點,給定相應的鄰接矩陣,需要求出從0號節點出發,經過且只經過每個頂點一次,最後仍回到0號節點的最小邊權。

思路:假設現在已訪問過的頂點集合(起點0當作還未訪問過的頂點)為s,當前所在頂點為v,用dp[s][v]表示從v出發訪問剩餘的所有頂點,最終回到頂點0的路徑的權值總和的最小值。由於從v出發可以移到任意乙個節點u∉s,因此

dp[v][0]=0

dp[s][v]=min][u]+d(v,u)}

我們只要按照這個遞推式進行計算即可。對於集合我們可以把每乙個元素的選取與否對應到乙個二進位制位裡,從而把狀態壓縮成乙個整數,方便了計算和維護。

核心**如下:

//input

int n;

int d[maxn][maxn];

int dp[1

if(s== (1

<1 && v==0)

//若已經訪問過所有節點且回到0號點

int res=inf;

for(int u=0;uif(!(s>>u &1))//若頂點u沒走過

}

## 狀壓 ##解法需要儲存一定的狀態資料,每個狀態資料通常情況下是可以通過2進製來表示的。這就要求狀態資料的每個單元只有兩種狀態,比如說棋盤上的格仔,放棋子或者不放,或者是硬幣的正反兩面。這樣就可以用0或者1來表示狀態資料的每個單元,而整個狀態資料就是乙個0、1組成的二進位制數。

接下來,我們再看一道題。

題目大意:輸入n和m表示乙個n*m的矩形,用1*2的方塊進行覆蓋,不能重疊,不能越出矩形邊界,問完全覆蓋完整個矩形有多少種不同的方案。

思路稍後新增…………

狀態壓縮DP

theme 給定乙個n m的玉公尺田,1 n,m 12。值為0表示不能在該塊種草,為1表示可以。現在要在其上中若干草地,要求任意草地間不相鄰 沒有公共邊 問不考慮草地個數的情況下,有多少種種植的方案?solution 用dp。又範圍很小,所以考慮狀態壓縮dp,另dp i j 表示從前i行種植,最後一...

狀態壓縮DP

總結狀壓dp轉移的方法 若某個狀態下可以對下 1.按二進位制讀入資料 2.列舉所有方案,如果合理 一行中沒有兩兩相鄰的 就儲存 i i 1 3.因為每一層的狀態只受上一層影響,因此迴圈兩次所有合理方案,為每乙個方案找到一系列下一層合理方案 4.遍歷每一行,並遍歷每一行的所有合理方案,若與預處理不矛盾...

dp 狀態壓縮

之前我們在討論的dp形式當中,大多數是對整數的動態規劃,然而對於集合而言呢 我們使用 dfs 嗎,看起來也可以,但是加上dp記憶 陣列的 動態規劃效率更高 那麼進一步討論,我們如何表示集合元素是否被使用的狀態呢 是通過康拓展開,next permutation 嗎?這個是全排列,是有些重複的,在 d...