zoukankan      html  css  js  c++  java
  • 剑指offer:矩形覆盖

    题目

    我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?

    解题思路

    当n=1时,只能竖着排列,所以f(1)=1

    当n=2时,可以横着和竖着两种排列,所以f(2)=2

    当排列了n-1块的时候,在加上第n块矩形进来时,此时有两种看法

    1)将第n块自己单独排列,那么此时的排列方法数目就是前面n-1块矩形排列的方法数目

    2)将第n块和第n-1块组合在一起排列,那么此时的排列方法数目就是前面n-2块矩形的排列方法数目*(第n块和第n-1块两个矩形可以排列的方法数目),本来两个矩形的排列数目有两种,但是若采取竖排的方式则与看法一重复,所以只有唯一一种排列方式就是横排

    所以f(n) = f(n-1)+f(n-2)

    图形实例

    代码

     这里只附上递归版本代码,非递归版本可去看斐波那契数列的那篇博文

        public int RectCover(int target) {
            if(target==1||target==2||target==0){
                return target;
            }else{
                return RectCover(target-1)+RectCover(target-2);
            }
        }
  • 相关阅读:
    【UNR#3】白鸽
    【POI2011】Garbage
    【NOI2010】海拔
    【HNOI2012】矿场搭建
    【UOJ#177】欧拉回路
    【BZOJ4500】矩阵
    【CF429E】Points and Segments
    【agc001F】Wide Swap
    【BZOJ2138】stone
    【JSOI2009】游戏
  • 原文地址:https://www.cnblogs.com/huanglf714/p/11106423.html
Copyright © 2011-2022 走看看