题目链接
题目描述
我们可以用 2 * 1 的小矩形横着或者竖着去覆盖更大的矩形。请问用 n 个 2 * 1 的小矩形无重叠地覆盖一个 2 * n 的大矩形,总共有多少种方法?
记n 与覆盖方法的关系为 f(n)
当 n = 1时,f(1) = 1;
当 n = 2时,第一块横着放有一种,第一块竖着放有一种,所以f(2) = 2;
当 n = 3时,第一块横着放,有 f(2)种,第一块竖着放,有f(1) 种,f(3) = f(1) + f(2)
当 n = i时,第一块横着放,有 f(i-1)种,第一块竖着放,有f(i-2)种,f(i) = f(i-1) + f(i-2)。
由此我们可以得到递推方程 f(n) = f(n-1) + f(n-2)。可以发现,这是斐波那契数列的变种。
public class Solution {
public int RectCover(int target) {
if (target <= 0)
return 0;
if (target <= 2)
return target;
int fir = 2;
int sec = 1;
int ret = fir;
for (int i = 3; i <= target; i++) {
ret = fir + sec;
sec = fir;
fir = ret;
}
return ret;
}
}