剑指offer:矩形覆盖

一、题目描述

我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?

解题思路:

1.针对该题,同样可先尝试着找规律
当n=1时,用2*1的矩形覆盖2*n的大矩形只有1种方法
当n=2时,用2*1的矩形覆盖2*n的大矩形只有2种方法
当n=3时,用2*1的矩形覆盖2*n的大矩形只有3种方法
当n=4时,用2*1的矩形覆盖2*n的大矩形只有5种方法
….
猜测其满足菲波那切数列
2. 针对2*n的矩形进行分析,假设其所有可能覆盖方法的总数为F(n)
如下图,假设第一次竖着放则剩下的可能数目为F(n-1)
假设第一次为横着放,意味着必需有另外一个对应的横着放,才能保证填满,因此剩下可能的数目为F(n-2)
因此得出公式:F(n) = F(n-1)+F(n-2)

———————— ————————— ———————         ——————
|       |         |       |       |      |
———————— ————————— ———————   ..... ——————
|       |         |       |       |      |
———————— ————————— ———————         ——————

二、实现代码

class Solution {
public:
    int rectCover(int number) {

       //考虑输入为0的情况,返回0
        if(number==0)
            return 0;
        if(number==1)
            return 1;
        if(number==2)
            return 2;

        //初始化菲波那切数列的头两项    
        int a=1,b=2;
        while(number>2)
        {
            b=b+a;
            a=b-a;
            number--;
        }
        return b;
    }
};

猜你喜欢

转载自blog.csdn.net/yph001/article/details/80939416