POJ 2411 Mondriaan's Dream (状态压缩DP)

2014-11-23 19:48:38 · 作者: · 浏览: 6

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