POJ 2411 状态压缩递,覆盖方案数

时间:2022-05-13 23:54:57

无非就是横着放与竖着放,状态中用1表示覆盖,0表示未覆盖。

 #include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <string.h>
#include <stdio.h>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <cmath>
#include <ctime>
#include <cassert>
#include <sstream>
using namespace std; const int N=; long long dp[N][<<N]; int h,w;
int row;
void dfs(int col,int pre,int cur) {
if (col>=w) {
dp[row][cur]+=dp[row-][pre];
return;
}
if (col+<=w) {
dfs(col+,pre<<|,cur<<); // 当前不放竖骨牌
dfs(col+,pre<<,cur<<|); // 放竖骨牌将本行与上行此列覆盖
}
if (col+<=w) {
dfs(col+,pre<<|,cur<<|); // 横放骨牌
}
}
int main () {
while (scanf("%d %d",&h,&w)!=EOF,h+w) {
if ((h*w)&) {
puts("");
continue;
}
if (h<w) swap(h,w); // 优化复杂度
memset(dp,,sizeof dp);
dp[][(<<w)-]=;
for (row=;row<=h;row++) {
dfs(,,);
}
printf("%lld\n",dp[h][(<<w)-]);
}
return ;
}