其他分享
首页 > 其他分享> > 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?

我们可以用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