剑指offer-矩形覆盖

433 阅读1分钟

矩形覆盖

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

思路

class Solution: # 同跳台阶
    def rectCover(self, n):
        if n <= 2:
            return n
        res = [0, 1, 2]
        for i in range(3, n + 1):
            res.append(res[-1] + res[-2])
        return res[-1]
'''
依旧是斐波那契数列,2*n的大矩形,和n个2*1的小矩形,其中 2*n 为大矩阵的大小
有以下几种情形:
n <= 0 大矩形为<= 2*0,return 1;
n = 1大矩形为2*1,只有一种摆放方法,return1;
n = 2 大矩形为2*2,有两种摆放方法,return2;
n >= 3 分为两步考虑:
# 竖着摆放
第一次摆放一块 2*1 的小矩阵,则摆放方法总共为f(n-1)
√
√
# 横着摆放(有上下两种情况)
第一次摆放一块1*2的小矩阵,则摆放方法总共为f(n-2)
因为,摆放了一块1*2的小矩阵(用√√表示),对应下方的1*2(用××表示)摆放方法就确定了,所以为f(n-2)
√	√
×	×
所以n >= 3  f(n) = f(n - 1) + f(n - 2)
'''