剑指offer——10.2 矩形覆盖

10.2 矩形覆盖

题目链接

NowCoder

题目描述

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


解题思路

当 n 为 1 时,只有一种覆盖方法:


当 n 为 2 时,有两种覆盖方法:


要覆盖 2*n 的大矩形,可以先覆盖 2*1 的矩形,再覆盖 2*(n-1) 的矩形;或者先覆盖 2*2 的矩形,再覆盖 2*(n-2) 的矩形。而覆盖 2*(n-1) 和 2*(n-2) 的矩形可以看成子问题。该问题的递推公式如下:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution {
public:
int rectCover(int number) {
if (number <= 0) {
return number;
}
int f1 = 1;
int f2 = 2;
int f3;

for (int i = 3; i <= number; i++) {
f3 = f1 + f2;
f1 = f2;
f2 = f3;
}
return f3;
}
};
创作不易,欢迎打赏!
-------------本文结束感谢您的阅读-------------