一道经典的插头DP,不知道哪里错了,求助各位 dalao,帮助找一下bug!!
在 h×w 的棋盘内铺满 1×2 或 2×1 的多米诺骨牌,求方案数。
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
using namespace std;
int f[2][5000];// 滚动数组
bool o=1;
int main()
{
int h,w;
int i,j,q;
cin>>h>>w;
while(h||w)
{
f[1][0]=1;
for(i=0;i<h;i++)// 遍历行
{
for(j=0;j<w;j++)// 遍历列
{
o=!o;
memset(f[o],sizeof(f[o]),0);
for(q=0;q<=(1<<w);q++)// 枚举所有可能性
if(f[!o][q])// 前面可以有这种状态
{
if(j!=w-1&&(!(q>>j&3)))// 可以横放且是空位
f[o][q^1<<(j+1)]+=f[!o][q];
f[o][q^1<<j]+=f[!o][q];// 竖放或不放
//q^1<<j: q的第j位由1变为0(不放),或0变为1(竖放)
}
}
}
cout<<f[o][0]<<"\n";
cin>>h>>w;
}
return 0;
}