修理柵欄;及排列木樁分析
今日面試題:修理柵欄
為了修理柵欄,需要將很長的木板鋸為N塊,長度分別為L1,L2...LN。鋸斷一塊兒木板,需要一定的開銷,開銷記為木板的長度。例如,長度為21的木板,鋸為三塊,長度分別為5,8,8。如下按照如下的順序據斷:
1. 首先鋸斷21為13和8兩塊兒,開銷為21
2. 然後鋸斷13為8和5兩塊兒,開銷為13
總的開銷為34。但也可以按照如下的順序:
1. 首先鋸斷21為16和5兩塊兒,開銷為21
2. 然後鋸斷16為8和8兩塊兒,開銷為16
總的開銷為37。比34要大。
問題是,給定N,以及每一塊兒的長度。如何保證最小的開銷。儘量採用高效的方法。
=============
排列木樁
原題
有N個木樁,高度分別為1到N。你現在要將木樁排列為一行,當你從左邊看的時候,只看到L個木樁(因為,一些高的木樁會擋住矮的木樁);從右邊看時,只看到R個木樁。給定N、L、R,你該如何排列木樁呢?
例1:N=3,L=2,R=1,可行的排列方案只有{2,1,3}。
例2:N=3,L=2,R=2,可行的排列方案有{1,3,2}{2,3,1}
分析
開始排列木樁的時候,應該如何選取第一根木樁呢?一個很直接的選擇就是先確定最高的木樁的位置,也就是N。因為,無論從左到右,還是從右到左看,都要到最高停下來。
確定了最高的木樁之後,無論從哪一邊看,都至少有一個木樁。接下來,該如何處理?想必大家已經想到了,開始遞迴唄。左右兩邊,也同樣是先確定最高的木樁的位置,依次遞迴下去。
構造的方法,是比較簡單地。但,往往這個時候面試題並沒有結束。面試官,會進一步問:給定NLR,有多少種排列木樁的方法呢?從一個構造問題,轉變為一個計數的問題。該如何做呢?方法仍舊是遞迴,我們嘗試寫出遞迴表示式。
假設,b(N,L,R)表示排列方案的總數。f(N, L)表示N個木樁,排列得到從左邊能夠看到L個木樁的方案總數。我們從f的遞迴形式入手分析。
首先,f(N,N)=1。從左到右,從低到高排列,只有一個方案。
然後,f(N,M)=0,當N< M時。顯而易見。
其次,f(N,1)=(N-1)!。當只看到一個木樁的時候,即最高的木樁排在最左邊,其他的木樁無論怎麼排列都可以。
再次,假設最高的木樁放在從左邊開始的第k個位置,則,我們要在剩下的N-1個木樁裡面,選取k-1個木樁放在最高木樁的左邊,並且,找到能看到L-1個木樁的方案數(因為最高的木樁一定能看見,所以是L-1個),此時剩下的N-K個木樁,可以任意排列,得到遞迴表示式如下:
f(N, L) = sum_{L<=k<=N} (N-1 選擇 k-1) * f(k-1, L-1) * (N-k)!
這個式子,是僅僅考慮了總左邊看到L個柱子的情況,再需要考慮,從右邊看,有R根柱子的方案呢?其實很簡單了,剩下的N-k個柱子,不要任意排列,要保證從右邊能夠看到R-1個柱子即可。所得遞迴式如下:
b(N,L,R) = sum_{L<=k<=N-R+1} (N-1 選擇 k-1) * f(k-1, L-1) * f(N-k,R-1)
如何?並不是很難的題目,只要抓住從哪根木樁開始即可。
其實,這個題目從最矮的木樁開始,也可以寫出漂亮、而且更簡單遞迴表示式的。簡單提示:
* 何時能夠看到最矮的木樁?
* 看到了如何?
* 看不到,又如何?
【分析完畢】
本文來自微信:待字閨中,2013-08-18釋出,原創@陳利人 ,歡迎大家繼續關注微信公眾賬號“待字閨中”。
相關文章
- 兄弟數字;及修理柵欄分析
- 排列木樁;及模糊距離分析
- JAVA柵欄Java
- 原始碼分析:CyclicBarrier 之迴圈柵欄原始碼
- 排列子串;及翻譯字串分析字串
- 子串查詢;及排列子串分析
- Java併發工具類(柵欄CyclicBarrier)Java
- 一個簡單木馬分析及接管利用
- lintcode-514-柵欄染色
- CUDA學習筆記之柵欄同步筆記
- bugku——聰明的小羊(柵欄密碼)密碼
- BetaBot 木馬分析
- 木馬逆向分析
- iOS-GCD常用函式和柵欄函式iOSGC函式
- 2020年T電梯修理考試題庫及T電梯修理考試軟體
- “大灰狼”遠控木馬分析及幕後真兇調查
- 全排列及相關擴充套件演算法(二)——求字典序下一組排列及全排列演算法套件演算法
- 閉鎖和柵欄的區分以及適用場景
- 2020汽車修理工(中級)考試及汽車修理工(中級)模擬考試系統
- 充電樁規模競爭格局分析
- 易語言3.5很暗的暗樁分析:)
- 探秘多執行緒-閉鎖、柵欄與非同步編排執行緒非同步
- 根據不同欄位,升降序排列查詢結果
- Free Star木馬分析與追溯
- 黑狐”木馬分析報告
- 盜號木馬分析報告
- 利用GDAL實現柵格影像差值計算及Geoserver自動釋出柵格影像Server
- P2731 [USACO3.3] 騎馬修柵欄 Riding the Fences
- 利用DNS隧道通訊木馬分析DNS
- java-多執行緒-CountDownLatch(閉鎖) CyclicBarrier(柵欄) Semaphore(訊號量)-Java執行緒CountDownLatch
- 新能源充電樁站場影片匯聚系統建設方案及技術特點分析
- Python arcpy建立柵格、批次拼接柵格Python
- Redis漏洞攻擊植入木馬逆向分析Redis
- 黑暗幽靈(DCM)木馬詳細分析
- 蔚來:將建3萬根目的地充電樁 全國充電樁運營商保有量分析
- 【原創】Winamp標題欄中文亂碼原因分析及修正
- BZOJ 1600 [Usaco2008 Oct]建造柵欄:dp【字首和優化】優化
- 2021年T電梯修理考試資料及T電梯修理模擬考試題