1.题目描述
我们可以用 2 ∗ 1 2*1 2∗1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个 2 ∗ 1 2*1 2∗1的小矩形无重叠地覆盖一个 2 ∗ n 2*n 2∗n的大矩形,总共有多少种方法?
2.算法描述
这个和跳台阶完全一样的思路啊。
跳到第n级台阶,要么从n-1级跳1级,要么从n-2级跳2级。类似的,覆盖
2
∗
n
2*n
2∗n的大矩形,要么是在
2
∗
(
n
−
1
)
2*(n-1)
2∗(n−1)的大矩形基础上再横着放一个
2
∗
1
2*1
2∗1的小矩形,要么是在
2
∗
(
n
−
2
)
2*(n-2)
2∗(n−2)的大矩形基础上再竖着放两个2*1的小矩形。
递推关系如下:
f
(
n
)
=
{
1
n
=
1
2
n
=
2
f
(
n
−
1
)
+
f
(
n
−
2
)
n
>
=
3
f(n)=\begin{cases} 1 &{n=1}\\ 2 &{n=2}\\ f(n-1)+f(n-2) &{n>=3} \end{cases}
f(n)=⎩⎪⎨⎪⎧12f(n−1)+f(n−2)n=1n=2n>=3
3.代码描述
3.1.Java代码
//迭代实现 时间效率高
public class Solution {
public int RectCover(int target) {
if(target<=2)
return target;
int[] dp = new int[target+1];
for(int i=0;i<target+1;i++){
if(i<=2)
dp[i] = i;
else
dp[i] = dp[i-1] + dp[i-2];
}
return dp[target];
}
}
//递归实现 时间效率低
public class Solution {
public int RectCover(int target) {
if(target<=2)
return target;
else
return RectCover(target-1) + RectCover(target-2);
}
}
3.2.Python代码
//迭代实现 时间效率高
# -*- coding:utf-8 -*-
class Solution:
def rectCover(self, number):
# write code here
if number<=2:
return number
dp = [0] * (number+1)
for i in range(number+1):
if i<=2:
dp[i] = i
else:
dp[i] = dp[i-1] + dp[i-2]
return dp[number]
#递归实现 时间效率低 貌似牛客不让全通过
# -*- coding:utf-8 -*-
class Solution:
def rectCover(self, number):
# write code here
if number<=2:
return number
else:
return rectCover(number-1) + rectCover(number-2)