题意:给定一个矩阵,只能放1*2的木块,问将这个矩阵完全覆盖的不同放法有多少种。
分析:横着放为11,竖着放为竖着的01,所以判断相邻两行是否被完全覆盖:只需判断两行状态合集(j | k)是否是满的, 两种状态是否有冲突(j & k)。
第一行直接预处理就行。
?
#include
#include
#include
#include
using namespace std;
__int64 dp[12][1 << 11]; //横着放为11,竖着放为0
// 1
int buff[1 << 11];
int n,m;
__int64 ans;
bool judge(int b) {
bool flag = 1;
while(b) {
if(b & 1) {
if((b >> 1) & 1) b = b >> 2;
else {
flag = 0;
b = b >> 1;
}
} else b = b >> 1;
if(flag == 0) return 0;
}
return flag;
}
void getbuff() {
int total = 1 << 11;
for(int i=0; i
?