站外题求助
  • 板块学术版
  • 楼主淸梣ling
  • 当前回复3
  • 已保存回复3
  • 发布时间2021/7/23 09:38
  • 上次更新2023/11/4 13:36:22
查看原帖
站外题求助
239192
淸梣ling楼主2021/7/23 09:38

一道经典的插头DP,不知道哪里错了,求助各位 dalaodalao,帮助找一下bug!!

problem

h×wh \times w 的棋盘内铺满 1×21 \times 22×12 \times 1 的多米诺骨牌,求方案数。

code

#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;
}
2021/7/23 09:38
加载中...