題意:給出 \(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 時,表示輸入終止,且該用例無需處理。...