我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
解决思路:
当第一块矩形为竖放,剩下的矩形有f(n-1)种;当第一块为横放,那么便需要一块放在第一块位置的下方,剩下f(n-2)种方式,可得f(n)=f(n-1)+f(n-2)。
//分而治之,重复计算,耗时较长
//C++
class Solution {
public:
int rectCover(int number) {
if(number<=2)
return number;
else
return rectCover(number-1)+rectCover(number-2);
}
};
//C++ 动态规划,将子问题的结果计算出来并保存,减少计算量,耗时短
class Solution {
public:
int a[1000];
int rectCover(int number) {
if(a[number]!=0)
return a[number];
if(number<=2) return number;
else
{
a[number]=rectCover(number-1)+rectCover(number-2);
}
return a[number];
}
};
//java
public class Solution {
public int RectCover(int target) {
if(target<=2)
return target;
else
return RectCover(target-1)+RectCover(target-2);
}
}