矩形覆盖

【题】矩形覆盖

我们可以用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的矩形,我们在第二步已经求出了,如果我们第一次竖着放,那么第二次只能横着放了,所以f(3) = f(2) + f(1)

当为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;
    }
};
原文地址:https://www.cnblogs.com/alias-blog/p/5418709.html