zoukankan      html  css  js  c++  java
  • 矩形覆盖

    【题】矩形覆盖

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

    分析:

    当n = 1 f(1) = 1 我们第一次填充只能横着放,所以我们只有一种方法,

    当n = 2 f(1) = 2 我们第一次横着放是一种,第一次竖着放也是一种可能,所有有两种方法

    当n = 3 f(3) = f(2) + f(1) 如果我们第一次横着放,那么还剩下一个2*2的矩形,我们在第二步已经求出了,如果我们第一次竖着放,那么第二次只能横着放了,所以f(3) = f(2) + f(1)

    当为n的时候,同理分析,第一次横着放,那么剩下的2*(n-1)在上一步肯定已经求出,第一次竖着放,那么剩下的2*(n-2)在上上步求出,所以f(n) = f(n-1)+f(n-2)

    可以看出,其实本题就是一个斐波那契数列,这里我使用斐波那契数列的循环求法。

    class Solution {
    public:
        int rectCover(int n) {
            int f1 = 1;        //相当于f(n-2)
            int f2 = 2;        //相当于f(n-1)
            int f = 0;
            if(n == 0)
                return 1;
            if(n <=2)
                return n;
            for(int i = 3 ; i <= n ; i++){
                f = f1 + f2;//f(n) = f(n-1) + f(n-2)
                f1 = f2;    //让f(n-2) = f(n-2)
                f2= f;        //f(n-1) = f(n)  也就是全部前移一位
            }
            return f;
        }
    };
  • 相关阅读:
    Matlab中transpose函数的使用
    Matlab中cell2mat的使用
    Matlab中find函数的使用
    Matlab中数组下标是logical,如何处理?
    Matlab中mat2cell的使用
    判断一棵树是否是另一棵树的子树
    链表中倒数第k个结点
    古德-图灵估计
    好书记录
    编程思路总结——递归
  • 原文地址:https://www.cnblogs.com/alias-blog/p/5418709.html
Copyright © 2011-2022 走看看