题目描述
我们可以用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;
}
};