我們可以用2×1的小矩形橫著或者豎著去覆蓋更大的矩形。請問用n個21的小矩形無重疊地覆蓋乙個2×n的大矩形,總共有多少種方法?
(參考牛客網daniel lee 分享的)用歸納法歸納如下,
(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)新增加的21 方塊與臨近的21方塊組成 2*2結構,然後可以變形成 「=」。於是 n = 4在原來n = 3基礎上增加了"| | ="、「= =」。
再自己看看這多出來的兩種形式,是不是只比n = 2多了「=」。其實這就是關鍵點所在...因為,只要21或12有相同的兩個時,就會組成2*2形式,於是就又可以變形了。
所以,自然而然可以得出規律: f(n) = f(n-1) + f(n-2), (n > 2)。
拓展
如果看了這一套理論還存在疑惑。可以嘗試將題目改成13方塊覆蓋3n、14方塊覆蓋4n。
相應的結論應該是:
(1)1 * 3方塊 覆 蓋3*n區域:f(n) = f(n-1) + f(n - 3), (n > 3)
(2) 1 4 方塊 覆 蓋4n區域:f(n) = f(n-1) + f(n - 4),(n > 4)
更一般的結論,如果用1m的方塊覆蓋mn區域,遞推關係式為f(n) = f(n-1) + f(n-m),(n > m)。
function rectcover(number)
return f;
}
劍指offer 10 矩形覆蓋
題目 我們可以用2 1的小矩形橫著或者豎著去覆蓋更大的矩形。請問用n個2 1的小矩形無重疊地覆蓋乙個2 n的大矩形,總共有多少種方法?思路 斐波那契數列的變種,為什麼是斐波那契數列的變種?首先我們 認為小矩形為n的時候的總數是n,而那麼根據組合數學裡的加法原理,我把此題分為兩類,第一類就是小矩形1 ...
劍指offer 10 矩形覆蓋
題目描述 我們可以用2 1的小矩形橫著或者豎著去覆蓋更大的矩形。請問用n個2 1的小矩形無重疊地覆蓋乙個2 n的大矩形,總共有多少種方法?思路 對於矩形的覆蓋,2 n大小的矩形,如果第乙個小矩形豎著放,那麼右邊還有n 1個空間來安排放置小矩形 如果第乙個小矩形橫著放,那麼它的下面一定是橫著放到,而右...
劍指offer10 矩形覆蓋
我們可以用2 1的小矩形橫著或者豎著去覆蓋更大的矩形。請問用n個2 1的小矩形無重疊地覆蓋乙個2 n的大矩形,總共有多少種方法?關於分治法 分治法,分而治之。就是將原問題劃分為n個規模較小,結構與原問題類似的小問題進行處理,遞迴地解決這些問題,然後再合併求解的過程。分治法在解決的流程上分為三個步驟 ...