狀態壓縮dp 蒙德里安的夢想

2021-10-02 07:45:11 字數 985 閱讀 1811

1≤n,m≤11

輸入樣例:

1 21 3

1 42 2

2 32 4

2 11

4 11

0 0輸出樣例:

#include

using

namespace std;

const

int n =

12, m =

1<< n;

int st[m]

;long

long f[n]

[m];

intmain()

else cnt ++;if

(cnt &

1) st[i]

=false

;// 掃完後要判斷一下最後一段有多少個連續的0

}memset

(f,0

,sizeof f)

; 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]))

// j & k == 0 表示 i 列和 i - 1列同一行不同時捅出來

// st[j | k] == 1 表示 在 i 列狀態 j, i - 1 列狀態 k 的情況下,i - 1 列無連續空行.

f[i]

[j]+

= f[i -1]

[k];

cout << f[m][0

]<< endl;

}return0;

}

狀態壓縮DP例題 蒙德里安的夢想

1.棋盤問題 1.1 蒙德里安的夢想 將一種狀態用二進位制來表示。對於此題,由於小方塊是1 2,如果先擺放橫著的,故在擺放第i列時,只需要考慮第i 1列有沒有衝突的。然後在插空擺放豎著的,如果橫向擺放已經確定,那麼豎向的也是確定的,即 總方案數 橫向擺放的方案數。要判斷擺放是否合法,即不能有空餘的小...

15 蒙德里安的夢想 狀態壓縮DP

位運算 二進位制表示狀態 狀態壓縮dp 先把橫著的小方塊放好,然後剩下位置用豎著的小方塊填充 然後就轉化為求橫著擺放小方塊的方案數 按列來求 狀態表示 dp i j 表示所有擺到了第i列,然後上一列伸出來的小方塊的狀態是j的情況下,總的方案數 狀態轉移 列舉一下i 1列的狀態 比如說當前狀態是j 0...

蒙德里安的夢想

求把n m的棋盤分割成若干個1 2的的長方形,有多少種方案。例如當n 2,m 4時,共有5種方案。當n 2,m 3時,共有3種方案。如下圖所示 輸入格式 輸入包含多組測試用例。每組測試用例佔一行,包含兩個整數n和m。當輸入用例n 0,m 0時,表示輸入終止,且該用例無需處理。輸出格式 每個測試用例輸...