剑指offer 矩形覆盖
- 题目描述
我们可以用2*1
的小矩形横着或者竖着去覆盖更大的矩形。请问用n
个2*1
的小矩形无重叠地覆盖一个2*n
的大矩形,总共有多少种方法?
- 题目解答
还是斐波那契数列。
试想,如果对2*n
的矩阵进行覆盖时,如果第一块小矩阵竖着放,相当于递归的求对2*(n-1)
的矩阵覆盖方法;如果第一个矩阵横着放,则相当于求对2*(n-2)
的矩阵的覆盖方法。得到递归公式如下:
F(n)=F(n-1)+F(n-2)
求解用非递归算法:
class Solution {
public:
int rectCover(int number) {
if (number == 0)
return 0;
else if (number == 1)
return 1;
else if (number == 2)
return 2;
else{
int ret;
int prior1 = 1;
int prior2 = 2;
for (int i = 3; i <= number; ++i){
ret = prior1 + prior2;
prior1 = prior2;
prior2 = ret;
}
return ret;
}
}
};