题目描述
- 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
- 地址:牛客链接
解决方法
- 一个归纳总结题:如何找递归关系
- 用 f(n) 表示 用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法,那么当 n = 1时,只有一种方法,那便是竖着放,所以 f(1) = 1; 当 n = 2时,有2种方法,那便是两个都竖着放,或者两个都横着放,所以 f(2) = 2
- 那么如果第一个竖着放,剩下为2*(n - 1)的大矩形,放法为 f(n - 1);如果第一个横着放,那么必须还有一个横着放,剩下为2*(n - 2)的大矩形,放法为 f(n - 2);
- 综上
f(n)=f(n−1)+f(n−2),n>=3;f(1)=1,f(2)=2
f
(
n
)
=
f
(
n
−
1
)
+
f
(
n
−
2
)
,
n
>=
3
;
f
(
1
)
=
1
,
f
(
2
)
=
2
这就类似于斐波那契数列和 跳台阶 问题。具体详解见以上链接
经验教训
代码实现
public class Solution {
public int RectCover(int target) {
if (target <= 2) {
return target;
}
int preValue = 1;
int curValue = 2;
for (int i = 3; i <= target; i++) {
curValue = preValue + curValue;
preValue = curValue - preValue;
}
return curValue;
}
}