题目描述

我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
 
比如n=3时,2*3的矩形块有3种覆盖方法:
写出数列后,我们发现这仍然是一个斐波那契问题,递归公式为
          n             n<=3
f(n)     
       f(n-1)+f(n-2)     n>3
解析,对于一个1*2的小矩形,我们可以竖着放,那剩下的2*(n-1)大矩形有  f(n-1)种覆盖方法
如果横着放,那么下边也只能横着放,那么剩下的2*(n-2)大矩形有  f(n-2)种覆盖方法
递归求解:
class Solution {
public:
    int rectCover(int number) {
        if(number<3)
            return number;
        else
            return rectCover(number-1)+rectCover(number-2);
    }
};

非递归求解:

public class Solution {
    public int RectCover(int target) {
        int r1 = 1;
        int r2 = 2;
        int r3 = target;
        for(int i=3;i<=target;i++){
            r3 = r1 + r2;
            r1 = r2;
            r2 = r3;
        }
        return r3;
    }
}

 

posted on 2020-09-20 22:03  曹婷婷  阅读(234)  评论(0编辑  收藏  举报