狀態壓縮DP 放方格

2022-06-30 17:48:11 字數 1347 閱讀 9263

f[i][j]表示第i列上一列橫向擺放方格伸出來的方案數

j:本列伸出來的格仔的二進位制表示。

k:上列伸出來的格仔的二進位制表示

1)不能有衝突,即1不能有重疊,j & k == 0;

2) 連續的空格不能為奇數,因為橫著的已經擺放玩了,只能放豎的了,所以不能有連續奇數個空格,j | k =奇數個0 。 時間複雜度o(n) = 11 * 2^11 * 2^11

#include #include 

#include

using

namespace

std;

const

int n = 12, m = 1

<

intn, m;

unsigned

long

long

f[n][m];

bool

st[m];

intmain()

else cnt++;

if(cnt & 1) st[i] = false

; }f[

0][0] = 1

;

for(int i = 1;i <= m; i ++)

for(int j = 0; j < 1

<< n; j++)

for(int k = 0; k < 1

<< n; k++)

if((j & k) == 0 && st[j |k])

f[i][j] += f[i-1

][k];

cout

<0]

i >> j & 1  不能打成    i >> j && 1

最短hamilton路徑(旅行商問題)

f[i][j] 集合:所有從0走到j,走過的所有點是i的所有路徑(110010) 二進位制表示

屬性:最小值min

狀態計算:f[i,j],根據倒數第二點的走法是2

狀態壓縮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.遍歷每一行,並遍歷每一行的所有合理方案,若與預處理不矛盾...