题解 | #矩形覆盖#
矩形覆盖
http://www.nowcoder.com/questionTerminal/72a5a919508a4251859fb2cfb987a0e6
对于2n的大矩形,一共需要n块小矩形块
分析:
当放置第n块小矩形时,一共有两种放法,*要么横着放,要么竖着放**
当第n块小矩形竖着放时,情况如图所示
此时前面一共有f(n-1)种放法;
当第n块小矩形横着放时,情况如图所示
此时第n块与第n-1块必定是横着叠放
此时前面一共有f(n-2)种放法;
因此f(n) = f(n-1) + f(n-2);
而f(0) = 0, f(1) = 1, f(2) = 2.
因此代码如下
public int rectCover(int target) { //一共需要n块木板,放置第n块木板的时候,要么横着放,要么竖着放 //如果是竖着放,前面的n-1就已经放满了,有f(n-1)种可能 //如果是横着放,一定是两根一起横着放,前面n-2就已经放满了, 有f(n-2)种可能 //所以f(n) = f(n-1) + f(n-2); if(target <=2){ return target; } int a = 1; int b =2; for(int i = 3;i<=target;i++){ b = a+b; a = b-a; } return b; }