【题】矩形覆盖
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
分析:
当n = 1 f(1) = 1 我们第一次填充只能横着放,所以我们只有一种方法,
当n = 2 f(1) = 2 我们第一次横着放是一种,第一次竖着放也是一种可能,所有有两种方法
当n = 3 f(3) = f(2) + f(1) 如果我们第一次横着放,那么还剩下一个2*2的矩形,我们在第二步已经求出了,如果我们第一次竖着放,那么第二次只能横着放了,所以
…
当为n的时候,同理分析,第一次横着放,那么剩下的2*(n-1)在上一步肯定已经求出,第一次竖着放,那么剩下的2*(n-2)在上上步求出,所以f(n) = f(n-1)+f(n-2)
可以看出,其实本题就是一个斐波那契数列,这里我使用斐波那契数列的循环求法。
class Solution { public: int rectCover(int n) { int f1 = 1; //相当于f(n-2) int f2 = 2; //相当于f(n-1) int f = 0; if(n == 0) return 1; if(n <=2) return n; for(int i = 3 ; i <= n ; i++){ f = f1 + f2;//f(n) = f(n-1) + f(n-2) f1 = f2; //让f(n-2) = f(n-2) f2= f; //f(n-1) = f(n) 也就是全部前移一位 } return f; } };
原文:http://www.cnblogs.com/alias-blog/p/5418709.html