问题描述
来自牛客剑指offer
我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
比如n=3时,2*3的矩形块有3种覆盖方法:
问题思路
1. 首先拿到问题先尝试找出前几组的值,比如n=0,1,2,3,4,5,发现一些规律
2. 不难发现,这规律是按照斐波那契数列增长的规律来的
3. 思考为什么呢?
4. 其实我们会发现当我们拿到一个新的问题规模时:有两种思路可以走:从问题规模的角度去考虑
1) 竖着放一个,那么此时问题的规模从n减少到n-1
2)横着放两个,那么此时问题的规模从n减少到n-2
3) 先不考虑排列组合什么乱七八糟的东西
4) 此时我们发现减少了规模的问题又可以再次减少规模,此时不难发现这是一个递归的过程
5)一直减少到边界条件:n=0,1,2 就停止迭代。
递归公式:
f
(
n
)
=
{
0
n
=
0
1
n
=
1
2
n
=
2
f
(
n
−
1
)
+
f
(
n
−
2
)
n
>
2
f(n)=\begin{cases} 0 & n = 0 \\ 1 & n = 1\\ 2 & n = 2\\ f(n-1) + f(n-2) & n >2 \\ \end{cases}
f(n)=⎩⎪⎪⎪⎨⎪⎪⎪⎧012f(n−1)+f(n−2)n=0n=1n=2n>2
从减少问题规模的角度我觉得是比较好理解的,而且如果当问题改成n*k的矩阵覆盖问题也很好去改写。
code
//根据递归公式,代码就很简单了
public int RectCover(int target) {
if (target == 1) return 1;
if (target == 2) return 2;
if (target == 0) return 0;
return RectCover(target-1) + RectCover(target-2);
}