/*
参考 http://happylch21.blog.163.com/blog/static/16563975920114140395486/
自己第一道 状态压缩dp
*/
#include <stdio.h>
#include <string.h>
const int maxn = (1<<12);
long long dp[2][maxn];
int n,m;
bool check(int s1,int s2)
{
int j,k;
for(int i=0;i<m;)
{
j=s1&(1<<i);
k=s2&(1<<i);
if(j && k) return 0; // 如果 j==1 k=0
if(j==0 && k==0)
{
if(i==m-1) return 0;
if ( ( s1 & (1<<(i + 1))) != 0 || (s2 & (1<<(i + 1 )))!=0) return 0;
i+=2;
}
else
i++;
}
return 1;
}
int main()
{
int tot;
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==0 && m==0) break;
if( (n*m)&1 )
{
printf("0\n");
continue;
}
if(n==1)
{
printf("1\n");
continue;
}
if(n<m)
{
int temp=n;
n=m;
m=temp;
}
tot = (1<<m);
memset(dp,0,sizeof(dp));
dp[0][0] = 1;
long long sum;
for(int i=1;i<=n;i++)
{
for(int j=0;j<tot;j++)
{
sum=0;
for(int k=0;k<tot;k++)
{
if(check(j,k))
sum+=dp[(i-1)&1][k];
}
dp[i&1][j]=sum;
if(i==n) {i++;break;};
}
}
printf("%lld\n",dp[n&1][0]);
}
return 0;
}
poj 2411
最新推荐文章于 2020-06-12 18:00:12 发布