AcWing 291 蒙德里安的夢想

2022-06-22 19:42:14 字數 824 閱讀 3884

題意:給出 \(n<=11, m<=11\)的矩陣,要求將矩陣全部恰好分成 \(1\times 2\) 或者 \(2\times 1\) 的小矩陣,問方案數。

題解:主要是dp陣列的含義定義要了解,設 \(dp_\) 表示的是第 \(i\) 行 \(j\) 形狀的方案數,這裡的 \(j\) 代表的是二進位制的狀態。想象乙個 \(01\) 串,然後在串中第 \(x\) 個0代表的是此列的第 \(x\) 行這個位置,是橫著的,且是橫著的第乙個格仔。是第乙個格仔,所以在 \(i\) 列,考慮 \(i - 1\) 列時,\(j_\) 才可以與 \(j_\) 進行 \(|\) 運算,然後 \(1\) 和 \(1\) 之間的 \(0\) 的數量必須是偶數才合法。注意會爆 \(long long\).

**:

#include #include #include #include #include #include using namespace std;

typedef long long ll;

const int n = 12;

ll dp[n][(1 << n)];

bool vis[n];

bool check(int x, int n)

else

d++;

x /= 2;

}if ((n - d + cnt) % 2 != 0)return 0;

return 1;

}void out(int x)

return;

}void solve() }}

}cout << dp[m][0] << endl;}}

int main()

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 找可轉...

acwing 291 蒙德里安的夢想(狀壓DP)

我們發現,只要確定了橫向小方格的位置 藍色 其餘位置都是縱向的小方格,就已經確定了一種方案,所以我們只需要列舉合法的橫向小方格,那麼就相當於列舉了方案數。先給出 f i j 的定義 第 i 列的 j 狀態下的方案總數。j用二進位制表示,如圖,第二列現在的狀態 藍色 就是 100 1表示此列有方格,0...

291 蒙德里安的夢想

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