首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >每日一题 剑指offer(矩阵覆盖)

每日一题 剑指offer(矩阵覆盖)

作者头像
小白学视觉
发布2019-10-24 00:49:40
发布2019-10-24 00:49:40
5800
举报

编程是很多偏计算机、人工智能领域必须掌握的一项技能,此编程能力在学习和工作中起着重要的作用。因此小白决定开辟一个新的板块“每日一题”,通过每天一道编程题目来强化和锻炼自己的编程能力(最起码不会忘记编程)

特别说明:编程题来自“牛客网”和“领扣”以及热心小伙伴的题目。由于小白有时想锻炼某一类编程方法,所以提供的代码不一定是最优解,但是本文提供的编程代码均为通过测试代码。

矩阵覆盖

题目描述

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

解析

用归纳法归纳如下,

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

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

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

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

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

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

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

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

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

再自己看看这多出来的两种形式,是不是只比n = 2多了“=”。其实这就是关键点所在...因为,只要2*1或1*2有相同的两个时,就会组成2*2形式,于是就又可以变形了。

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

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

相应的结论应该是:

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

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

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

代码

代码语言:javascript
复制
 1class Solution {
 2    public: int rectCover(int target) {
 3        if (target < 1) {
 4            return 0;
 5        } else if (target == 1 || target == 2) {
 6            return target;
 7        } else {
 8            return rectCover(target-1) + rectCover(target-2);
 9        }
10    }
11};
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-09-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小白学视觉 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 矩阵覆盖
    • 题目描述
    • 解析
    • 代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档