题目:
我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2n的大矩形,总共有多少种方法?
比如n=3时,23的矩形块有3种覆盖方法:
思路:
其实在列举前几个的时候就知道是fibnaci(除了0的情况不符合,而且样例还真带0真是无聊),但是不知道为什么是fibnaci。和跳台阶对比发现fibnaci都是每个状态的更新都是有两条通路的情况,跳台阶很直观,但是这道题得把问题进行比较好的描述抽象才行:一次可以在上一次的基础上添加一块,若这一块竖着放啧基于上一个状态无重复的所有情况再加一个竖的也都是无重复的,但此外的那些情况该怎么表示呢?(马后炮)如果列举出前几个情况还是有可能发现规律的:
会发现无法表示的这几个,都是横着结尾的,横着结尾的是什么情况呢,就是要抽出之前的一条尾部配凑,则在长度为n时横着的之前的应该是n-2,竖着的之前是n-1,fibnaci的原因。
//16:26--02:09 class Solution { public: int rectCover(int number) { int n1 = 1, n0 = 1; if(number == 0) return 0; if(number == 1) return n1; while(number>1){ int n2 = n1 + n0; n0 = n1; n1 = n2; --number; } return n1; } };