要求
- 时间限制:1秒
- 空间限制:32768K
- 热度指数:241970
题目描述
我们可以用 2 ∗ 1 2*1 2∗1的小矩形横着或者竖着去覆盖更大的矩形。请问用 n n n个 2 ∗ 1 2*1 2∗1的小矩形无重叠地覆盖一个 2 ∗ n 2*n 2∗n的大矩形,总共有多少种方法?
思路
从后往前倒推,对于 2 ∗ n , ( n > 2 ) 2*n,(n>2) 2∗n,(n>2)来说,可以有如下几种方法得到:
- 从 2 ∗ ( n − 1 ) 2*(n-1) 2∗(n−1)再添加一个竖着放的 2 ∗ 1 2*1 2∗1可以得到,一共有 f ( n − 1 ) f(n-1) f(n−1)种方法;
- 从 2 ∗ ( n − 2 ) 2*(n-2) 2∗(n−2)再添加两个横着放的 2 ∗ 1 2*1 2∗1可以得到,一共有 f ( n − 2 ) f(n-2) f(n−2)中方法;注意竖着放两个 2 ∗ 1 2*1 2∗1的会和第一种方法雷同;
- 从 2 ∗ ( n − 3 ) 2*(n-3) 2∗(n−3)无论怎么变化得到 2 ∗ n 2*n 2∗n的所有情况都在1,2中出现了,因此有0中方法;对于 2 ∗ ( n − i ) , ( i > = 3 ) 2*(n-i),(i>=3) 2∗(n−i),(i>=3)同理可以得到。
因此可以得到 f ( n ) = f ( n − 1 ) + f ( n − 2 ) f(n)=f(n-1)+f(n-2) f(n)=f(n−1)+f(n−2)
python实现
# -*- coding:utf-8 -*-
class Solution:
def rectCover(self, number):
# write code here
if number <= 0:
return 0
elif number == 1 or number == 2:
return number
preNum = 2
prePreNum = 1
while number > 1:
preNum = preNum + prePreNum
prePreNum = preNum - prePreNum
number = number - 1
return prePreNum
- 运行时间:27ms
- 占用内存:5852k
C++实现
class Solution {
public:
int rectCover(int number) {
if (number == 0 || number == 1 || number == 2)
return number;
int preNum = 2; int prePreNum = 1;
while (number>1){
preNum = preNum + prePreNum;
prePreNum = preNum - prePreNum;
number--;
}
return prePreNum;
}
};
- 运行时间:3ms
- 占用内存:484k