我們可以用 2×1這道題的實質也是斐波那契數列。從題目中可以知道,當 n≥22\times 1
2×1 的小矩形橫著或者豎著去覆蓋更大的矩形。請問用 n
nn 個 2×1
2\times 1
2×1 的小矩形無重疊地覆蓋乙個 2×n
2\times n
2×n 的大矩形,總共有多少種方法?
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,則若...