题目描述
我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
思路
问题可以转化为求一串求由1,2组成的数列有多少种排列方式,数列各元素之和为n。
假设元素之和为n的数列有F(n)种排列方式:
假如第一个数为1,则剩余n-1个数有F(n-1)种排列方式。
假如第一个数为2,则剩余n-2个数有F(n-2)种排列方式。
所以,F(n) = F(n-1) + F(n-2)
非递归
def rectCover(self, n):
p,q=0,1
for i in range(n):
s=p+q
p=q
q=s
return p
递归
def rectCover(self, n):
if n==0 or n==1:
return n
return self.Fibonacci(n-1)+self.Fibonacci(n-2)
或(深度优先搜索)
def rectCover(self, number):
if number==0:
return 0
self.sum=0
def dfs(n,depth):
if n==depth:
self.sum+=1
elif n>depth:
dfs(n,depth+1)
dfs(n,depth+2)
dfs(number,0)
return self.sum