剑指offer:面试题9.3——矩形覆盖问题
题目:我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
class Solution {
public:
int rectCover(int number) {
//设覆盖2*n有f(n)种方法。当覆盖最左侧矩形时,有两种方法,一种横着一种竖着
//若竖着覆盖,则剩下的矩形有f(n-1)种方法
//若横着覆盖,则下面横着的矩形部分也必须横着的方式覆盖,设下(n-2)*2个矩形,有f(n-2)种覆盖方法
//因此f(n)=f(n-1)+f(n-2);是一个递归问题
if(number==1)return 1;
if(number==2)return 2;
int fs=1;
int fl=2;
int sum=0;
int i;
for(i=3;i<=number;i++)
{
sum=fl+fs;
fs=fl;
fl=sum;
}
return sum;
}
};