hihoCoder week8 狀態壓縮 一

2022-01-26 14:17:22 字數 788 閱讀 5424

狀態壓縮  寫了兩個半小時  太菜了

題目鏈結

#include using

namespace

std;

const

int n = 10

;const

int maxn = 1

<<11

;int

n, m, q, w[maxn];

//訪問到達i時候, 前面m-1個的狀態

int dp[1024

][maxn];

int count(int

x)

return

cnt;

}void print(int

tmp)

cout

<< mx <}void

printall()

}int

main()

//第0個選就是0 第0個不選就是 w[0]

dp[0][0] = 0; dp[0][1] = w[0

];

for(int i=1; i) }}

else

//由於此時i>=m了 保證之前肯定有m-1個狀態, 所以前m-1個狀態 分別在[0, m-2]之間

//因而此時的i 應該放在 m-1 位, 然後可以插入i, 就更新最優值

for(int st=0; st<(1

<) }}

}//printall();

print(n-1

);

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