剑指offer 矩形覆盖

剑指offer 矩形覆盖

  • 题目描述

我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n2*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;
		}
    }
};
弹钢琴的猫 /
Published under (CC) BY-NC-SA in categories 算法  tagged with 剑指offer