/**
状态压缩
POJ 2411 Mondriaan's Dream
题意:
给出一个n*m的矩阵用1*2的瓷砖铺满
瓷砖摆放的形式有两种:
一种横着放(11)一种竖着放(01)
按行dp,合理的状态就是state[i]|state[j]值全1
state[i]|state[j]不存在奇数个1的情况
*/
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
bool fun(int num){
int ret=0;
while(num){
if(num&1) ret++;
else{
if(ret&1) return false;
ret=0;
}
num>>=1;
}
if(ret&1) return false;
return true;
}
ll dp[12][2050];
int main(){
int n,m;
while(~scanf("%d%d",&n,&m)&&(n|m)){
int top=1<<m;
memset(dp,0,sizeof(dp));
for(int i=0;i<top;i++)
if(fun(i)) dp[1][i]=1;
for(int i=2;i<=n;i++){
for(int j=0;j<top;j++){
if(dp[i-1][j]){
for(int k=0;k<top;k++){
if((j|k)==top-1&&fun(j&k))
dp[i][k]+=dp[i-1][j];
}
}
}
}
printf("%lld\n",dp[n][top-1]);
}
return 0;
}
POJ 2411 Mondriaan's Dream
最新推荐文章于 2020-11-11 17:05:29 发布