《剑指offer》 递归和循环第四题:

题目描述:

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

思路:

       这个题的本质是斐波那契数列,如何将这个题理解为斐波那契数列,我的思路是这样的:

       考虑最后一列的情况,最后一列的两个小矩形可以竖着放,也可以横着放。如果最后一个小矩形竖着放,那么前面的所有小矩形可以覆盖2行n-1列的部分,记为f(n-1)。如果最后一个小矩形横着放,那么最后两个小矩形所在的位置都必须是横着放的,前面的所有小矩形可以覆盖2行n-2列的部分,记为f(n-2)。所以总的覆盖数位f(n-1)+f(n-2)。与跳台阶问题本质是一样的。

      但切记不能把思路想成变态跳台阶,要是2*f(n-1),

      将每个小矩形的放置方向都列举出来,那么就会出现重复计算的情况。例如,当考虑第n-1列时,n-2列中的最后一个小矩形必须是横着放的,而第n列的第一个小矩形也必须是横着放的,这样才能保证没有重叠的情况出现。但是,如果将所有小矩形的方向都列举出来,就会出现将这两个小矩形都视为竖着放的情况,从而重复计算,导致结果错误。

代码实现:

public int solution(int n)
    {
        if(n==0||n==1||n==2)
            return n;

        return solution(n-1)+solution(n-2);

    }

测试类:

public static void main(String[] args) {
        Reverse4 reverse=new Reverse4();
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        System.out.println(reverse.solution(n));
    }

测试结果:

《剑指offer》 递归和循环第四题:_第1张图片

你可能感兴趣的:(算法,java,数据结构)