牛客网_剑指offer_矩形覆盖_c++

题目描述

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

解题思路:

这道题目其实本质上就是斐波那契数列,具体分析如下:
首先,对于n=1的时候,只有一种情况;
其次,对于n=2的时候,一共有两种情况,两个都是竖着或者两个都是横着;
最后分析递归式,由于到达n的方式有两种,要么是前一个是竖着的小矩形,要么是前面是两个横着的小矩形,如果前一个是竖着的小矩形,那就是看f(n - 1)有多少种情况,然后每一种情况加上这个竖着的矩形就是n个小矩形了;同理,前面是两个横着的小矩形的时候有f(n - 2)种可能性。
具体代码如下:

class Solution 
{
public:
    int rectCover(int number) 
    {
        if (number <= 0) return number;
        
        if (number == 1) return 1;
        if (number == 2) return 2;
        int first = 1;
        int second = 2;
        int tmp = 0;
        for (int i = 2; i < number; i++)
        {
            tmp = first + second;
            first = second;
            second = tmp;
        }
        return second;
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_40349531/article/details/89513523