描述
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,从同一个方向看总共有多少种不同的方法?
比如n=3时,2*3的矩形块有3种不同的覆盖方法(从同一个方向看):
n=1时,有一种方法。
n=2时,有两种方法,
n=3时,有三种方法,如描述所示。
n=4时,有五种方法。
这样一看 ,还是斐波那契数列啊。
因为不保证n=5时答案正不正确,所以还是推理一下。
首先n=5时,怎么排列小矩阵呢?
还是看最后一级怎么排列的?
n=5时,其实就是比n=4时多了右边蓝色这一部分,那么有几种方法去排列覆盖它呢?
首先肯定是加入竖着的一个小矩阵,那么就是跟n=4时的方法数量一样,跟之前青蛙跳台阶的原理差不多,就是每个方法最后都加了一步,但是方法数量不变。
然后就是加入两个横着的小矩阵:
这里请注意,蓝色部分是n=5时新增的面积,这时候如果我们横着摆入小矩阵(黄色部分),等于说就会用到以前的面积(红色部分),所以如果是横着摆入的话,方法数量是跟n=3时一样的,因为横着摆也只有一种可能性,就是横着摆两个黄色的小矩阵,之前的空白部分就变成了n=3。
所以的方法数量等于
也就是我们知道的斐波那契数列。
class Solution:
def rectCover(self, number):
# write code here
if number < 0:
return None
if number == 0:
return 0
if number == 1:
return 1
if number == 2:
return 2
a = 1
b = 2
for i in range(0, number-2):
sum = a + b
a = b
b = sum
return sum