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時,表示輸入終止,且該用例無需處理。輸出格式 每個測試用例輸...