问题描述
有一个 M * N的矩阵,现在需要使用 1 * 2 的骨牌进行覆盖,问总的覆盖方案数有多少?
题目链接:http://hihocoder.com/contest/hiho43/problem/1
问题求解
标记骨牌覆盖状态
1, 横向排的骨牌表示:
1 1
2, 纵向排的骨牌表示:
0
1
骨牌状态转移
对于第 i 行与第 i+1 行,其中某段格子状态如下:转移一
i:0
i+1:1
// 如果第 i 行的某个格子为0,那么第 i+1 行对应的一定是1才行。转移二
i:1
// 第 i 行的这个格子为1,有两种可能:纵向放置骨牌的下面那个;或是横向放置骨牌的第二个
i+1:0
// 不管上面那个格子是如何放置,第i+1行都可以是0
,即竖向摆放骨牌的第一个格子。转移三
i:1 1
i+1:1 1
// 第 i 行和第 i+1 行都是横向排列
那么由此而来,就有了如下代码了:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <string>
#define MAX_K 7
#define STATUS_COUNT (2<<MAX_K)
using namespace std;
struct Matrix {
int matrix[STATUS_COUNT][STATUS_COUNT];
Matrix() {
memset(matrix, 0, sizeof(matrix));
}
};