題目位址
易錯點:
結論1:在合法狀態下,對於每個橫塊的正上方兩個格仔中任意乙個格仔,一定屬於某個橫塊的一部分或某個豎塊的下半部.
證明:
假設有乙個橫塊的正上方兩格中的某格為乙個豎塊的上半部,由定義可知該情況不成立.
對於任意乙個格仔,只有可能為以下三種狀態之一:豎塊上半部、豎塊下半部、半個橫塊.
由(1)(2)可知,乙個橫塊的上方兩格中的某格的一部分只有可能為為豎塊下半部或半個橫塊.
結論1得證.
結論2:如果狀態2可作為狀態1的下一行,那麼假設狀態1和狀態2中兩狀態都為橫格的部分提取出來,並將提取出來的部分設為1,其他部分設為0,那麼新狀態的連續1的個數一定為偶數.
證明:由結論1可知結論2成立.
證明:由定義可知結論3成立.
證明:由結論3可知結論4成立.
結論4可保證豎塊的合法性,但不能保證橫塊的合法性;結論2可保證橫塊的合法性,但不能保證豎塊的合法性。因此,結合結論2與結論4即可保證兩相鄰狀態的合法性.
("久旱"和"甘霖"同時滿足是"久旱逢甘霖"的充要條件,"萌"和"眼鏡"同時滿足是"栗山未來"的充要條件,"作畫崩壞"和"大ip"同時滿足是"jc社"的充要條件)
#include#include#includeusing namespace std;
long long dp[13][1<<13];
bool check(int s)
if(rest&1)return 0;
return 1;
}int main()
}else cnt ^= 1;//處理橫塊(利用了0/1變換的原理)
in_s[i] = (isnotlicit || cnt) ? 0 : 1;//0:不合法,1:合法
} f[0][0] = 1;
for (int i = 1; i <= n; i++)
for (int j = 0; j < 1 << m; j++)
cout << f[n][0] << endl;
}}
291 蒙德里安的夢想
求把 n m 的棋盤分割成若干個 1 2 的的長方形,有多少種方案。例如當 n 2,m 4 時,共有 5 種方案。當 n 2,m 3 時,共有 3 種方案。如下圖所示 輸入包含多組測試用例。每組測試用例佔一行,包含兩個整數 n 和 m 當輸入用例 n 0,m 0 時,表示輸入終止,且該用例無需處理。...
AcWing 291 蒙德里安的夢想
題意 給出 n 11,m 11 的矩陣,要求將矩陣全部恰好分成 1 times 2 或者 2 times 1 的小矩陣,問方案數。題解 主要是dp陣列的含義定義要了解,設 dp 表示的是第 i 行 j 形狀的方案數,這裡的 j 代表的是二進位制的狀態。想象乙個 01 串,然後在串中第 x 個0代表的...
Acwing 291 蒙德里安的夢想
求把 n m 的棋盤分割成若干個 1 2 的的長方形,有多少種方案。1 n,m 11 用f i s 表示第i行狀態為s的方案數 對於s 0表示i 1列無伸向第i列的方格,1表示有伸向第i列的方格 先預處理可用狀態 對這一題所有狀態都可用 state.clear for int i 0 i 1 找可轉...