题目描述
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
比如n=3时,2*3的矩形块有3种覆盖方法:
写出数列后,我们发现这仍然是一个斐波那契问题,递归公式为
n n<=3
f(n)
f(n-1)+f(n-2) n>3
解析,对于一个1*2的小矩形,我们可以竖着放,那剩下的2*(n-1)大矩形有 f(n-1)种覆盖方法
如果横着放,那么下边也只能横着放,那么剩下的2*(n-2)大矩形有 f(n-2)种覆盖方法
递归求解:
class Solution { public: int rectCover(int number) { if(number<3) return number; else return rectCover(number-1)+rectCover(number-2); } };
非递归求解:
public class Solution { public int RectCover(int target) { int r1 = 1; int r2 = 2; int r3 = target; for(int i=3;i<=target;i++){ r3 = r1 + r2; r1 = r2; r2 = r3; } return r3; } }