仓库源文站点原文


title: 算法:矩形覆盖 cover: https://img.paulzzh.com/touhou/random?2 toc: true date: 1996-07-27 00:00:01 categories: 算法题目

tags: [算法题目, 递归]

<br/>

<!--more-->

矩阵覆盖

题目描述

矩形覆盖

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

比如n=3时,2x3的矩形块有3种覆盖方法:


分析

可以使用递归的思想:

(1)当 n < 1时,显然不需要用2*1块覆盖,按照题目提示应该返回 0。

(2)当 n = 1时,只存在一种情况。

(3)当 n = 2时,存在两种情况。

img

(4)当 n = 3时,明显感觉到如果没有章法,思维难度比之前提升挺多的。

img

... 尝试归纳,本质上 n 覆盖方法种类都是对 n - 1 时的扩展。

可以明确,n 时必定有 n-1时原来方式与2*1的方块结合。也就是说, f(n) = f(n-1) + ?(暂时无法判断)。

(5)如果我们现在归纳 n = 4,应该是什么形式?

5.1)保持原来n = 3时内容,并扩展一个 2*1 方块,形式分别为 “| | | |”、“= | |”、“| = |”

5.2)新增加的2x1 方块与临近的2x1方块组成 2x2结构,然后可以变形成 “=”。于是 n = 4在原来n = 3基础上增加了"| | ="、“= =”。

再自己看看这多出来的两种形式,是不是只比n = 2多了“=”

其实这就是关键点所在...因为,只要2x1或1x2有相同的两个时,就会组成2*2形式,于是就又可以变形了。

所以,自然而然可以得出规律: f(n) = f(n-1) + f(n-2), (n > 2)。

如果看了这一套理论还存在疑惑。可以尝试将题目改成1x3方块覆盖3xn、1x4方块覆盖4xn。

相应的结论应该是:

(1)1x3方块 覆 盖3*n区域:f(n) = f(n-1) + f(n - 3), (n > 3)

(2) 1x4方块 覆 盖4*n区域:f(n) = f(n-1) + f(n - 4),(n > 4)

更一般的结论,如果用1m的方块覆盖mn区域,递推关系式为f(n) = f(n-1) + f(n-m),(n > m)。

<br/>

链接:https://www.nowcoder.com/questionTerminal/72a5a919508a4251859fb2cfb987a0e6?f=discussion

来源:牛客网


代码

public class Solution {
    public int RectCover(int number) {
        if (number < 1) return 0;
        int g = 1, f = 2;
        while (--number != 0) {
            f = f + g;
            g = f - g;
        }
        return g;
    }
}