修理柵欄;及排列木樁分析

紫鳳發表於2013-08-26

今日面試題:修理柵欄

為了修理柵欄,需要將很長的木板鋸為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釋出,原創@陳利人 ,歡迎大家繼續關注微信公眾賬號“待字閨中”。

相關文章