狀態壓縮DP

2021-10-04 05:37:40 字數 2730 閱讀 2775

總結狀壓dp轉移的方法:

若某個狀態下可以對下

1.按二進位制讀入資料

2.列舉所有方案,如果合理(一行中沒有兩兩相鄰的)就儲存 i & (i << 1)

3.因為每一層的狀態只受上一層影響,因此迴圈兩次所有合理方案,為每乙個方案找到一系列下一層合理方案

4.遍歷每一行,並遍歷每一行的所有合理方案,若與預處理不矛盾,繼續遍歷其下一行的所有合理方案,將情況累加。

#include

#include

#include

using

namespace std;

const

int n =

14, m =

1<<

12, p =

1e8;

vector<

int> head[m]

;//每個狀態可以轉移到的其他轉態

vector<

int> state;

int n , m;

//n是行 ,m是列

int f[n]

[m];

//f[i][j]表示已經擺完前i行,第i行的轉態是j

int w[n]

;//給定的圖

intmain()

for(

int i =

0; i <

1<< m ; i++

)//2.列舉所有方案,如果合理(一行中沒有兩兩相鄰的)就推入if(

!(i &

(i <<1)

)) state.

push_back

(i);

for(

int i =

0; i < state.

size()

; i++

)//3.因為每一層的狀態只受上一層影響,因此迴圈兩次所有合理方案,為每乙個

for(

int j =

0; j < state.

size()

; j++

)//方案找到一系列下一層合理方案

f[0]

[0]=

1;//小技巧:這裡截止到n+1,就省去最後的累加

for(

int i =

1; i <= n +

1; i++

)//4.遍歷每一行,並遍歷每一行的所有合理方案,若與預處理不矛盾,就遍歷

for(

int j =

0; j < state.

size()

; j++

)//其下一行的所有合理方案,將情況累加。if(

!(state[j]

& w[i]))

for(

int a : head[j]

) f[i]

[j]=

(f[i]

[j]+ f[i -1]

[a])

% p;

cout << f[n +1]

[0]<< endl;

return0;

}

1.列舉所有方案,如果合理(一行中沒有兩兩相鄰的)就儲存 i & (i << 1)

2.因為每一層的狀態只受上一層影響,因此迴圈兩次所有合理方案,為每乙個方案找到一系列下一層合理方案

3.遍歷每一行,並遍歷每一種國王的個數,並遍歷每一行的所有合理方案,若與預處理不矛盾,繼續遍歷其下一行的所有合理方案,若改方案下國王個數小於當前迴圈內限制的國王個數,則將情況累加。

#include

#include

using

namespace std;

const

int n =

12, k =

110, m =

1<<11;

long

long f[n]

[k][m]

;int n , m;

int cnt[m]

;vector<

int> head[m]

, state;

intcount

(int a)

intcheck

(int a)

intmain()

for(

int i =

0; i < state.

size()

; i++

)for

(int j =

0; j < state.

size()

; j++

)

f[0]

[0][

0]=1

;//初始化不能忘!!!!!

for(

int i =

1; i <= n +

1; i++

)for

(int j =

0; j <= m ; j++

)for

(int a =

0; a < state.

size()

; a++

)for

(int b : head[a]

)

cout << f[n +1]

[m][0]

<< endl;

return0;

}

狀態壓縮DP

首先,我們以一道狀壓經典題tsp來引入。tsp問題 一張圖上有n個點,給定相應的鄰接矩陣,需要求出從0號節點出發,經過且只經過每個頂點一次,最後仍回到0號節點的最小邊權。思路 假設現在已訪問過的頂點集合 起點0當作還未訪問過的頂點 為s,當前所在頂點為v,用dp s v 表示從v出發訪問剩餘的所有頂...

狀態壓縮DP

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

dp 狀態壓縮

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