题意:给定一个矩阵,只能放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