题意:用1*2的多米诺骨牌填充H*W的棋盘,W,H<=11.
思路:因为W,H还是相对比较大的,如果在用矩阵的话,矩阵会很大,这个时候就要考虑轮廓线DP了。
本来以为自己非常理解轮廓线DP的,但是这次发现自己在一个小地方理解错误了。格子a[i][j]是当前考虑的格子,但是我们的目标是a[i-1][j]必须是被覆盖的。而且,横向的格子应该向左放,而不是向右放。
其他的具体思路,看前几篇日志吧。
代码如下:
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int H,W;
long long dp[2][1<<15];
int main(void)
{
//freopen("input.txt","r",stdin);
while(scanf("%d%d",&H,&W),H||W){
int pre = 1, now = 0,s = 1<<H;
memset(dp[now],0,sizeof(dp[now]));
dp[now][s-1] = 1;
for(int i = 0; i < W; ++i){
for(int j = 0; j < H; ++j){
swap(pre,now);
memset(dp[now],0,sizeof(dp[now]));
for(int u = 0; u < s; ++u){
if(u & 1 << j){
if(j && ! (u & 1 << (j - 1)))
dp[now][u | 1 << (j-1)] += dp[pre][u];
}
dp[now][u ^ 1 << j] += dp[pre][u];
}
// for(int u = 0; u < s; ++u)
// printf("%d%c",dp[now][u], u == s - 1 ?'\n':' ');
}
}
printf("%lld\n",dp[now][s-1]);
}
return 0;
}