剑指offer之矩形覆盖
问题描述:我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
比如n=3时,2*3的矩形块有3种覆盖方法:
|
问题分析:
首先可以把n等于1,2,3,4的覆盖方法找出来,看看能否找到规律。用f(n)表示n的覆盖方法,可以找出f(1)=1,f(2)=2,f(3)=3,f(4)=5…我们其实已经可以看出来,f(n)=f(n-1)+f(n-2)。初始条件:f(1)=1,f(2)=2。
但这样推论或许还不严谨,所以可以用迭代的想法思考为什么可以 这样表示。
当n=1时,只能有一块竖着覆盖,所以f(1)为1。
当n=2时,可以横着覆盖,也可以竖着覆盖,有2种覆盖方式。
当n=3时,
(1)第三级竖着覆盖,只用了一个,那么还剩两个,种类为f(2)。
(2)第三级为横着覆盖,用了两个,那么还剩1个,种类为f(1)。
当n=n时,
(1)第n级竖着覆盖,只用了一个,那么还剩n-1个,种类为f(n-1)。
(2)第n级为横着覆盖,用了两个,那么还剩n-2个,种类为f(n-2)。
综上可以看出,初始条件为f(1)=1,f(2)=2,n>=3时,有f(n)=f(n-1)+f(n-2);
具体求解:
public class Solution {
public int RectCover(int target) {
if(target<=2){
return target;
}
return RectCover(target-1)+RectCover(target-2);
}
}