1. 程式人生 > >劍指offer--20.矩形覆蓋

劍指offer--20.矩形覆蓋

就是 -s scribe span code alt ima wid 牛客網

鏈接:https://www.nowcoder.com/questionTerminal/72a5a919508a4251859fb2cfb987a0e6
來源:牛客網 @DanielLea

思路分析:

痛定思痛,還是不能夠貪小便宜。用歸納法歸納如下, (1)當 n < 1時,顯然不需要用2*1塊覆蓋,按照題目提示應該返回 0。 (2)當 n = 1時,只存在一種情況。 技術分享圖片
(3)當 n = 2時,存在兩種情況。 技術分享圖片
(4)當 n = 3時,明顯感覺到如果沒有章法,思維難度比之前提升挺多的。 技術分享圖片
... 嘗試歸納,本質上 n 覆蓋方法種類都是對 n - 1 時的擴展。 可以明確,n 時必定有 n-1時原來方式與2*1的方塊結合。也就是說, f(n) = f(n-1) + ?(暫時無法判斷)。 (4)如果我們現在歸納 n = 4,應該是什麽形式? 4.1)保持原來n = 3時內容,並擴展一個 2*1 方塊,形式分別為 “| | | |”、“= | |”、“| = |” 4.2)新增加的2*1 方塊與臨近的2*1方塊組成 2*2結構,然後可以變形成 “=”。於是 n = 4在原來n = 3基礎上增加了"| | ="、“= =”。 再自己看看這多出來的兩種形式,是不是只比n = 2多了“=”。其實這就是關鍵點所在...因為,只要2*1或1*2有相同的兩個時,就會組成2*2形式,於是就又可以變形了。 所以,自然而然可以得出規律: f(n) = f(n-1) + f(n-2), (n > 2)。
如果看了這一套理論還存在疑惑。可以嘗試將題目改成1*3方塊覆蓋3*n、1*4方塊覆蓋4*n。 相應的結論應該是: (1)1 * 3方塊 覆 蓋3*n區域:f(n) = f(n-1) + f(n - 3), (n > 3) (2) 1 *4 方塊 覆 蓋4*n區域:f(n) = f(n-1) + f(n - 4),(n > 4)

更一般的結論,如果用1*m的方塊覆蓋m*n區域,遞推關系式為f(n) = f(n-1) + f(n-m),(n > m)。

------------------------------------------------------------------------------------------------------------------

時間限制:1秒 空間限制:32768K 熱度指數:270399

題目描述

我們可以用2*1的小矩形橫著或者豎著去覆蓋更大的矩形。請問用n個2*1的小矩形無重疊地覆蓋一個2*n的大矩形,總共有多少種方法?
class Solution {
public:
    int rectCover(int number) {
        if(number < 0) return 0;
        else if(number == 1 || number == 2) return number;
        else return rectCover(number-1
) + rectCover(number-2); } };

---------

劍指offer--20.矩形覆蓋