骨牌覆盖问题

 骨牌覆盖问题,就是用  1x2 大小的骨牌,铺设一个给定大小的一个矩形区域,要求必须铺满,且不可以超出边界。问总的铺设方案数位多少?

   这一类问题就是骨牌覆盖问题。


不同规模的数据有不同的方法。


  

   下面来看看最简单的   2×N  区域里面的铺设方法数。

N=0,一种;  N=1 为一种 ; N=2,两种;N=3,5种;

较为容易看出是斐波拉契数列;所以快速幂矩阵求斐波拉契数列;如果看不出来为什么是菲波拉契数的可以放一放,看看下面的3×n的方法之后,你就可以试着来证明2×N的为什么是这个数列。


   再来看看  3×N;我们可以来腿一下递推关系。我们可以假设我们已经放好 i 行的骨牌,即将要放 第 i+1 行的骨牌。则第 i 行的骨牌状态有


有这8中状态。 上一行的某一种状态能不能到这种状态,需要一个对应关系。用一个二维数组记录到这个状态的方案数。

       所以一开始用二维数组记录


数组行数代表在第几排,列数代表该一排的某一状态。一次一次递推下去便可以。

我们刚刚说了需要一个状态的对应关系,那个关系是上一个状态能否得到这个状态,我把这个关系用箭头表示,能到达的状态用箭头来指向它。

我们得到这幅对应关系,就是得到了递推关系。所以,我们可以根据这幅图构造一个矩阵。

便得到这个矩阵。



然后矩阵快速幂;

便可以求出答案;



posted @ 2016-06-06 14:29  Code-dream  阅读(361)  评论(0编辑  收藏  举报