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