1-Description
我们可以用2×1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2×1的小矩形无重叠地覆盖一个2×n的大矩形,总共有多少种方法?
2-Solution
1-问题分析
这仍旧是一个斐波那契数列的问题,下面具体分析:
- 假设第一次我们用2×1的小矩形横着去覆盖,则覆盖的次数取决于后续还没进行覆盖的矩形,则总的覆盖次数为f(n-1)
- 假设第一次我们用2×1的小矩形竖着去覆盖,则覆盖的次数取决于后续还没进行覆盖的矩形,则总的覆盖次数为f(n-2)
所以可以得到总的覆盖次数为:
f
(
n
)
=
f
(
n
−
1
)
+
f
(
n
−
2
)
f(n) = f(n-1) + f(n-2)
f(n)=f(n−1)+f(n−2)
可以看出这是一个典型的斐波那契数列问题
2-解决代码
注意到当n=1时,共有1种覆盖方法;n=2时共有2种覆盖方法。可以得到下面的解决代码
class Solution {
public:
int rectCover(int n) {
if(n < 3) return n;
else {
return rectCover(n - 1) + rectCover(n - 2);
}
}
};
可以采用动态规划的方法进行优化
class Solution {
public:
int rectCover(int n) {
int f=0,g=1;
if(n < 1) return 0;//当n<=0时直接返回0
else {
while(n--){
g = g + f;
f = g - f;
}
}
return g;
}
};