题意:
用1*2的矩形铺满n*m的大矩形有几种方式
分析:
n,m很小可以状态压缩我们发现第i行的情况只和i-1行和i行有关判断一下爆搜一下
ACcode:
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <vector>
#define maxn 205
#define inf 0x3f3f3f3f
#define ll long long
using namespace std;
int n,m;
ll dp[20][1<<11],tmp;
void dfs(int state,int x,int pos){
if(pos==m){
dp[x][state]+=tmp;
return ;
}
dfs(state,x,pos+1);///竖着
if(pos<=m-2&&!(state&1<<pos)&&!(state&1<<pos+1))dfs(state|1<<pos|1<<pos+1,x,pos+2);///横着
}
int main(){
while(scanf("%d%d",&n,&m)&&n+m){
if(n*m&1){cout<<"0\n";continue;}
memset(dp,0,sizeof(dp));
tmp=1;
dfs(0,1,0);
for(int i=2;i<=n;++i)
for(int j=0;j<1<<m;++j)
if(dp[i-1][j])tmp=dp[i-1][j],dfs(~j&((1<<m)-1),i,0);
cout<<dp[n][(1<<m)-1]<<'\12';
}
return 0;
}