骨牌覆盖问题,就是用 1x2 大小的骨牌,铺设一个给定大小的一个矩形区域,要求必须铺满,且不可以超出边界。问总的铺设方案数位多少?
这一类问题就是骨牌覆盖问题。
不同规模的数据有不同的方法。
下面来看看最简单的 2×N 区域里面的铺设方法数。
N=0,一种; N=1 为一种 ; N=2,两种;N=3,5种;
较为容易看出是斐波拉契数列;所以快速幂矩阵求斐波拉契数列;如果看不出来为什么是菲波拉契数的可以放一放,看看下面的3×n的方法之后,你就可以试着来证明2×N的为什么是这个数列。
再来看看 3×N;我们可以来腿一下递推关系。我们可以假设我们已经放好 i 行的骨牌,即将要放 第 i+1 行的骨牌。则第 i 行的骨牌状态有
有这8中状态。 上一行的某一种状态能不能到这种状态,需要一个对应关系。用一个二维数组记录到这个状态的方案数。
所以一开始用二维数组记录
数组行数代表在第几排,列数代表该一排的某一状态。一次一次递推下去便可以。
我们刚刚说了需要一个状态的对应关系,那个关系是上一个状态能否得到这个状态,我把这个关系用箭头表示,能到达的状态用箭头来指向它。
我们得到这幅对应关系,就是得到了递推关系。所以,我们可以根据这幅图构造一个矩阵。
便得到这个矩阵。
然后矩阵快速幂;
便可以求出答案;