算法题目
来源:互联网 发布:电信网络诈骗50万以上 编辑:程序博客网 时间:2024/05/22 04:31
我们可以用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),(n > m)。
public
class
Solution {
public
int
RectCover(
int
target) {
if
(target <
1
) {
return
0
;
}
else
if
(target ==
1
|| target ==
2
) {
return
target;
}
else
{
return
RectCover(target-
1
) + RectCover(target-
2
);
}
}
}
0 0
- 算法题目
- 算法题目
- 算法题目
- 算法题目
- 算法题目
- 几个算法题目
- 一道算法题目,值得一看
- 算法题目收集
- 几个算法题目
- 转贴]一些算法题目
- 几个算法题目
- C++算法题目
- 算法题目汇集
- 一些经典算法题目
- ACM 算法题目解
- 一道算法题目
- Java面试算法题目
- 一个算法题目
- cii框架影响行数
- MSMQ 的持久化
- onvif的博客李迟的专栏
- RabbitMQ消息队列(一): Detailed Introduction 详细介绍
- Linux/Centos下/lib64/libc.so.6: version `GLIBC_2.14' not found问题(升级glibc2.20)
- 算法题目
- P1001 A+B Problem
- 3Ceph架构剖析
- C++第4次作业(基础班)—循环结构程序设计
- 条件变量pthread_cond_signal、pthread_cond_wait
- 字母旋转游戏
- 动态的获取excel中最后一条数据所在的行数
- Bootstrap返回数据格式
- Cypher语言语法简介