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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

skj1995

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值