2020年10月24日 矩陣覆蓋問題

SamuraiChamploo發表於2020-10-24

題目描述

我們可以用2乘1的小矩形橫著或者豎著去覆蓋更大的矩形。請問用n個2乘1的小矩形無重疊地覆蓋一個2乘n的大矩形,總共有多少種方法?

比如n=3時,2乘3的矩形塊有3種覆蓋方法:
在這裡插入圖片描述

思路:

沒有明確方法的時候,最好的方法就是遞推找規律

  • n = 1 的時候

    只能橫著覆蓋,一種

  • n = 2 的時候

    可以橫著和豎著覆蓋,兩種

  • n = 3 的時候

    第三級橫著覆蓋,用了一級,剩下 n = 2,有兩種覆蓋方法
    第三季豎著覆蓋,用了兩級,剩下 n = 1,有一種覆蓋方法
    總共有 3 種

  • n = 4 的時候

    第 4 級橫著覆蓋,用了一級,剩下 n = 3,有三種覆蓋方法
    第 4 級豎著覆蓋,用了兩級,剩下 n = 2,有兩種覆蓋方法
    總共有 5 種方法

  • n = n 的時候

    第 n 級橫著覆蓋,用了一級,剩下 n = n - 1,所以關注第 n - 1 種有幾種覆蓋方法
    第 n 級豎著覆蓋,用了兩級,剩下 n = n - 2,所以關注第 n - 2 種有幾種覆蓋方法
    總和為兩種情況的總和

  • 從 n = 1 到 n = 4 的示意圖如下:

  • 在這裡插入圖片描述

所以回答上面的問題,塗掉最後一級矩陣的時候,可以選擇使用橫向完成,也可以使用豎向完成,橫向塗剩下 n - 1 階,豎向塗剩下 n - 2 階

關注 n - 1 與 n - 2 時的塗法有幾種,這就是斐波那契數列

public class Solution {
    public int RectCover(int target) {
        if(target<=2){
            return target;
        }
        int total1 = 1;
        int total2 = 2;
        int total = 0;
        for(int i = 3; i<=target;i++){
            total = total1 +total2;
            total1 =total2;
            total2 =total;
        }
        return total;
    }
}

相關文章