劍指offer-10-矩形覆蓋
題目描述
我們可以用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) { // write code here if(number==0)return 0; var f=1,g=2; while(--number){ g=f+g; f=g-f; } return f; }
劍指offer-10-矩形覆蓋