题目描述
我们可以用2×12\times12×1的小矩形横着或者竖着去覆盖更大的矩形。请问用nnn个2×12\times 12×1的小矩形无重叠地覆盖一个2×n2 \times n2×n的大矩形,总共有多少种方法?
比如n=3n=3n=3时,2×32\times32×3的矩形块有333种覆盖方法:
解题思路
显然是一道递推类题目,可以使用迭代或者递归方法解决。
为方便起见,nnn个矩形的覆盖总数用Cover(n)Cover(n)Cover(n)来表示。
通过画图,
n=1n = 1n=1时,Cover(1)=1Cover(1) = 1Cover(1)=1,
n=2n = 2n=2时,Cover(2)=2Cover(2) = 2Cover(2)=2,
n=3n = 3n=3时,Cover(3)=3Cover(3) = 3Cover(3)=3,
n=4n = 4n=4时,Cover(4)=5Cover(4) = 5Cover(4)=5,
n=5n = 5n=5时,Cover(5)=8Cover(5) = 8Cover(5)=8,
n=6n = 6n=6时,Cover(6)=13Cover(6) = 13Cover(6)=13,
.....................
n=nn = nn=n时,Cover(n)=Cover(n−1)+Cover(n−2)Cover(n) = Cover(n - 1) + Cover(n - 2)Cover(n)=Cover(n−1)+Cover(n−2)。
通过经验,越是这种题目,越有规律可循,而且代码量往往很少,最重要的是找到规律。
本题目核心当n>2n > 2n>2后,矩形的覆盖数就是一个2×12\times12×1的矩形和两个2×12\times12×1矩形“平躺” 这两种类型的矩形的排列组合数。
代码实现
class Solution {
public:
int rectCover(int number) {
if(number == 0)
return 0;
if(number == 1)
return 1;
if(number == 2)
return 2;
return rectCover(number - 1) + rectCover(number - 2);
}
};
此题目代码不难,就不展示非递归的代码了,要学会多总结题目规律。