题目描述
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
思路
首先想到分治的思想。
分治,分而治之。就是将原问题划分为n个规模较小,结构与原问题类似的小问题进行处理,递归地解决这些问题,然后再合并求解的过程。
分为三个步骤:
1.分解:将原问题划分为n个规模较小,结构与原问题类似的小问题。
2.解决:若子问题规模小,足以处理,则求解,否则继续递归处理。
3.合并:将子问题的解,合并成为原问题的解。
用2*1的小矩形覆盖2*n的大矩形,第一步有两种方法:竖行填充和横行填充。
若竖行,则原问题的规模缩减为对于2*(n-1)的矩形的填充。
若横行,则原问题的规模缩减为对于2*(n-2)的矩形的填充。
由此,可以得到递推式:f(n)=f(n-1)+f(n-2).
AC代码:
public class Solution {
public int RectCover(int target) {
if(target<=0)
return 0;
else if(target==1)
return 1;
else if(target==2)
return 2;
else{
return RectCover(target-1)+RectCover(target-2);
}
}
}