我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
作者:互联网
两种方法:
第一种:排列组合的方法:
假设2*number的矩形,需要2*1的矩形个数为H,需要1*2的为S。容易得到等式H+S=number(列数关系得到的).
举例如下:比如number=5,这样H的取值为0、2、4,
当H为0时,S为5,只有一种。
当H为2时,S为3,这时候就相当于SSSH的全排列个数,为(4!)/((3!)*(1!))
当H为4时,S为1,这时就相当于SHH的全排列个数,为(3!)/((2!)*(1!))
由例子可以得到:总个数为Sum+=(number-H/2)! / ((H/2)!*S!)
代码如下:
class Solution:
def rectCover(self, number):
# write code here
if number==0:
return 0
Sum=0
for H in range(0,(number/2)*2+1,2):
S=number-H
Sum+=self.Factorial(number-H/2)/(self.Factorial(S)*self.Factorial(H/2))
return Sum
def Factorial(self,Number):
if Number==0:
return 1
else:
return reduce(lambda x,y:x*y,range(1,Number+1))
第二种方法:递推公式法:
假设所求的个数为F(number)
则有F(number)=F(number-1)+F(number-2),也就是说总个数按照最后一个或者两个是用1*2的矩阵还是2*1的矩阵分类的个数之和
代码如下:
class Solution:
def rectCover(self, number):
# write code here
FDict={}
FDict[0]=0
FDict[1]=1
FDict[2]=2
for i in range(3,number+1):
FDict[i]=FDict[i-1]+FDict[i-2]
return FDict[number]
标签:return,覆盖,self,个数,number,FDict,矩形,横着 来源: https://blog.csdn.net/skj1995/article/details/91555427