代码改变世界

动态规划--dominoes

2013-02-27 12:34  Dr.Ray  阅读(250)  评论(0)    收藏  举报

每个骨牌1*2,给出一个3*n的矩形,求用骨牌填满矩形的方法的数量。

 

首先,边际情况分析,3*1无解,3*2有3解,3*3无解,3*4除了分成2个3*2的情况以外还有2个解,。。。。。。。。

易得n必为偶数。

分析完以后,还是不能找到递推。。

但是一个一个去掉dominoe会发现,填充一端可看做3种可能,1、齐边,2、缺一个角 3、缺一个竖向骨牌(与2加一个横向骨牌不同的情况),图示:0表示横向骨牌,1表示竖向。

1:  00    2:前面齐边,紧跟一个:     3:前面齐边后跟:00 00

     00                                   1                           1 00

     00                                   1                           1 00

 

于是用opt1[]储存1的情况数,opt2[]储存2,opt3[]储存3;

 

易得递推:

opt1[n] = opt2[n-1] *2 + opt3[n] *2 + opt1[n-2]

opt2[n] = opt1[n-1] + opt3[n-1]

opt3[n] = opt1[n-4] + opt2[n-1]

 

最后输出齐边opt1相应的值就可以了

阶段:n长度

状态:三个opt,1为主,2、3为辅助,转移方程见上