JZ10 矩阵覆盖

该博客探讨了如何使用斐波那契数列来解决一种特定的数学问题:如何用2*1的小矩形无重叠地覆盖一个2*n的大矩形。通过递归推理,博主展示了当n=5时,覆盖方法的数量也是遵循斐波那契数列的规律。文章详细解释了推理过程,并提供了Python代码实现来计算给定n值时的不同覆盖方法数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

描述

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

所以f(n=5)的方法数量等于f(n=5)=f(n=4)+f(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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值