我們可以用2*1的小矩形橫著或者豎著去覆蓋更大的矩形。請問用n個2*1的小矩形無重疊地覆蓋乙個2*n的大矩形,總共有多少種方法?
關於分治法
分治法,分而治之。就是將原問題劃分為n個規模較小,結構與原問題類似的小問題進行處理,遞迴地解決這些問題,然後再合併求解的過程。
分治法在解決的流程上分為三個步驟:
1.分解:將原問題劃分為n個規模較小,結構與原問題類似的小問題。
2.解決:若子問題規模小,足以處理,則求解,否則繼續遞迴處理。
3.合併:將子問題的解,合併成為原問題的解。
題目要求:
我們可以用2*1的小矩形橫著或者豎著去覆蓋更大的矩形。請問用number個2*1的小矩形無重疊地覆蓋乙個2*number的大矩形,總共有多少種方法?
分析:我們化繁為簡,從下面的示例說起(設該問題的處理函式為rectcover)。
由於小矩形的尺寸是2×1,所以有大矩形為2×number的存在,那麼我們第一步就可以有兩種處理方式:
第一步如果選擇豎方向填充,那麼該問題的規模就縮減為對於剩餘的2×(number-1)的大矩形的填充。
如果,第一步如果選擇橫方向的填充,則第二排的前面兩個小矩形也只能如此填充,那麼該問題的規模就縮減為對於剩餘的2×(number-2)的大矩形的填充.
結合上述分析,很容易得到遞推的關係: rectcover(number)=rectcover(number-1)+rectcover(number-2)。當然此處也要注意遞迴跳出條件的判定。
public
static
intrectcover(int target)
劍指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個空間來安排放置小矩形 如果第乙個小矩形橫著放,那麼它的下面一定是橫著放到,而右...
劍指offer 10矩形覆蓋
題目描述 我們可以用2 1的小矩形橫著或者豎著去覆蓋更大的矩形。請問用n個2 1的小矩形無重疊地覆蓋乙個2 n的大矩形,總共有多少種方法?分析 類似於斐波那契數列 方法一 直接遞迴 時間複雜度o 2 n 太大 public int rectcover int number else if numbe...