题目描述
我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
比如n=3时,2*3的矩形块有3种覆盖方法
思路:
1、记f(n)为:用2x1的小矩形无重叠地覆盖一个2xn的大矩形,的总方法数。
2、则f(n)可以分出以下A、B两种情况:
A:在2x(n-1)的基础上加一块
B:在2x(n-2)的基础上加两块
接下来解释为什么只考虑这两种情况。
3、以下两种情况得出的结果总体上会与A、B完全相同,所以不用重复考虑。不太好理解,画图列举一下比较好。
4、以下情况看似不同,但其实就是A或B情况下的一种,也不必考虑。
延伸开来可以发现:在2x(n-3)的基础上加三块、在2x(n-4)的基础上加四块…这些都可以归结到A、B两种情况中去
5、综上:f(n) = f(n-1) + f(n-2),且明显f(1) = 1,类似斐波那契数列;
6、可以递归、递推。
7、注意牛客网的输入用例中有 “输入为 0 ,对应输出为 0”,在边界条件上要考虑这一点。
以下是递推的
int rectCover(int number) {
if(1 >= number) return number;
int a = 1, b = 1, t;
for(int i=2; i<=number; i++)
{
t = a+b;
a = b;
b = t;
}
return b;
}