首页 > 其他 > 详细

矩形覆盖

时间:2016-04-21 21:51:49      阅读:163      评论:0      收藏:0      [点我收藏+]

【题】矩形覆盖

我们可以用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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!