劍指offer 矩形覆蓋

2021-10-02 13:14:23 字數 1575 閱讀 8659

我們可以用 2×1

2\times 1

2×1 的小矩形橫著或者豎著去覆蓋更大的矩形。請問用 n

nn 個 2×1

2\times 1

2×1 的小矩形無重疊地覆蓋乙個 2×n

2\times n

2×n 的大矩形,總共有多少種方法?

這道題的實質也是斐波那契數列。從題目中可以知道,當 n≥2

n\geq 2

n≥2時,小矩形其實只有兩種覆蓋方法,第一種是豎著,此時小矩形的寬等於大矩形的寬,而大矩形的長因小矩形的覆蓋,長度可看作是減 1;另一種覆蓋方法是橫著,而且必須用兩個小矩形一起橫著才能滿足大矩形的寬度,大矩形的長度看看作減 2。覆蓋後剩下可覆蓋的矩形分別為 2×(

n−1)

2\times (n-1)

2×(n−1

) 和 2×(

n−2)

2\times (n-2)

2×(n−2

),繼續覆蓋。

因此,把 2×n

2\times n

2×n 的大矩形的覆蓋總數記為 f(n

)f(n)

f(n)

,大矩形第一次使用 1 個豎著放的小矩形得到的覆蓋總數是 f(n

−1

)f(n-1)

f(n−1)

,第一次使用 2 個橫著放的小矩形得到的覆蓋總數是 f(n

−2

)f(n-2)

f(n−2)

,也就是 f(n

)=f(

n−1)

+f(n

−2

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

f(n)=f

(n−1

)+f(

n−2)

,找到遞迴公式。

當 n =1

n=1n=

1 時,顯然只有一種覆蓋方法,f(1

)=

1f(1)=1

f(1)=1

;當 n=2

n=2n=

2 時,可知有兩種覆蓋方法,f(2

)=

2f(2) =2

f(2)=2

。因此找到邊界條件。

也可以通過前面幾項的列舉發現規律:

f(1) = 1

f(2) = 2

f(3) = 3

f(4) = 5

f(5) = 8

遞迴演算法實現:

class solution 

else if(number==1 || number==2)

return rectcover(number-1)+rectcover(number-2);

}};

非遞迴演算法實現:

class solution 

else if(number==1 || number==2)

int a=1,b=2;

for(int i=3;i<=number;i++)

return b;

}};

參考:牛客網

劍指offer 矩形覆蓋

我們可以用2 1的小矩形橫著或者豎著去覆蓋更大的矩形。請問用n個2 1的小矩形無重疊地覆蓋乙個2 n的大矩形,總共有多少種方法?觀察題目中的矩形,2 n的,是個長條形。本來腦中想象的是複雜的華容道,但是既然只是簡單的長條形,那麼依然逆向分析。既然是長條形的,那麼從後向前,最後乙個矩形2 2的,只有兩...

劍指Offer 矩形覆蓋

題目描述 我們可以用2 1的小矩形橫著或者豎著去覆蓋更大的矩形。請問用n個2 1的小矩形無重疊地覆蓋乙個2 n的大矩形,總共有多少種方法?思路 這個也是跳青蛙的變形 但是要自己找出當前的鋪法和以前鋪法的關係 注意到 情況一 當前塊的話可以由上一塊加上當前這一塊的豎著放 情況二 或者是 上上一塊加上兩...

劍指offer 矩形覆蓋

1 題目描述 我們可以用2 1的小矩形橫著或者豎著去覆蓋更大的矩形。請問用n個2 1的小矩形無重疊地覆蓋乙個2 n的大矩形,總共有多少種方法?2 思路 遞迴呼叫 若不存在小矩形,則返回0 若只存在乙個小矩形,則只有一種方法,返回1 若存在兩個小矩形,則存在兩種方法,返回2 若小矩形的數量大於2,則若...