区间型DP
區間型DP是一類經典的動態規劃問題,主要特征是可以先將大區間拆分成小區間求解最后由小區間的解得到大區間的解。
有三道例題
一、石子合并
在一個圓形操場的四周擺放N堆石子,現要將石子有次序地合并成一堆.規定每次只能選相鄰的2堆合并成新的一堆,并將新的一堆的石子數,記為該次合并的得分。
試設計出1個算法,計算出將N堆石子合并成1堆的最小得分和最大得分.
二、能量項鏈
在Mars星球上,每個Mars人都隨身佩帶著一串能量項鏈。在項鏈上有N顆能量珠。能量珠是一顆有頭標記與尾標記的珠子,這些標記對應著某個正整數。并且,對于相鄰的兩顆珠子,前一顆珠子的尾標記一定等于后一顆珠子的頭標記。因為只有這樣,通過吸盤(吸盤是Mars人吸收能量的一種器官)的作用,這兩顆珠子才能聚合成一顆珠子,同時釋放出可以被吸盤吸收的能量。如果前一顆能量珠的頭標記為m,尾標記為r,后一顆能量珠的頭標記為r,尾標記為n,則聚合后釋放的能量為m*r*n(Mars單位),新產生的珠子的頭標記為m,尾標記為n。
需要時,Mars人就用吸盤夾住相鄰的兩顆珠子,通過聚合得到能量,直到項鏈上只剩下一顆珠子為止。顯然,不同的聚合順序得到的總能量是不同的,請你設計一個聚合順序,使一串項鏈釋放出的總能量最大。
例如:設N=4,4顆珠子的頭標記與尾標記依次為(2,3) (3,5) (5,10) (10,2)。我們用記號⊕表示兩顆珠子的聚合操作,(j⊕k)表示第j,k兩顆珠子聚合后所釋放的能量。則第4、1兩顆珠子聚合后釋放的能量為:
(4⊕1)=10*2*3=60。
這一串項鏈可以得到最優值的一個聚合順序所釋放的總能量為
((4⊕1)⊕2)⊕3)=10*2*3+10*3*5+10*5*10=710。
三、關燈問題
某一村莊在一條路線上安裝了n盞路燈,每盞燈的功率有大有小(即同一段時間內消耗的電量有多有少)。老張就住在這條路中間某一路燈旁,他有一項工作就是每天早上天亮時一盞一盞地關掉這些路燈。
為了給村里節省電費,老張記錄下了每盞路燈的位置和功率,他每次關燈時也都是盡快地去關,但是老張不知道怎樣去關燈才能夠最節省電。他每天都是在天亮時首先關掉自己所處位置的路燈,然后可以向左也可以向右去關燈。開始他以為先算一下左邊路燈的總功率再算一下右邊路燈的總功率,然后選擇先關掉功率大的一邊,再回過頭來關掉另一邊的路燈,而事實并非如此,因為在關的過程中適當地調頭有可能會更省一些。
現在已知老張走的速度為1m/s,每個路燈的位置(是一個整數,即距路線起點的距離,單位:m)、功率(W),老張關燈所用的時間很短而可以忽略不計。
請你為老張編一程序來安排關燈的順序,使從老張開始關燈時刻算起所有燈消耗電最少(燈關掉后便不再消耗電了)。
這三道題中前兩道是幾乎一樣的,首先他們都是環型所以先要斷環為鏈,將環復制兩遍成鏈,對原來的區間進行操作,這樣我們在一些邊界上就可以重復利用鏈的信息了。而這類題通用的解法一般是用f[i][j]表示i—j這個區間的最優值,而枚舉順序一般是最外層枚舉區間長度,第二層枚舉區間起點,最后一層枚舉區間內的分界點(這兩道題是先合并那兩個子區間的再合并成一個區間,因為他們都是兩個區間合并成一個區間的問題)最優值就從這些子區間的最優值轉移過來就行了。
而第三題就稍有不同,但對于子問題的構建沒有太大區別,f[i][j]表示關閉i-j區間的燈所消耗的最少電能,然后這個題有個特點就是他關完燈一定在區間的左端或右端的這個性質,從他所在的起點開始(因為起點的值是0,這是確定的,一層層的向外擴展,每次只比上次多關一盞,這樣就可以慢慢的求出答案了。
總得來說這類dp最重要的是將大區間拆分成小區間求解最后由小區間的解得到大區間的解,而且對于兩個子區間和并成一個大區間的問題枚舉順序往往是最外層枚舉區間長度,第二層枚舉區間起點,最后一層枚舉區間內的分界點(例題還有括號序列),除此以外一般和區間的端點有關系(如山區建小學)。
轉載于:https://www.cnblogs.com/hyl2000/p/6060342.html
總結
- 上一篇: Will not attempt to
- 下一篇: FF的插件iMacros简单交流