1021
石子歸併
v1n堆石子擺成一條線。現要將石子有次序地合併成一堆。規定每次只能選相鄰的2堆石子合併成新的一堆,並將新的一堆石子數記為該次合併的代價。計算將n堆石子合併成一堆的最小代價。
例如: 1 2 3 4,有不少合併方法
1 2 3 4 => 3 3 4(3) => 6 4(9) => 10(19)
1 2 3 4 => 1 5 4(5) => 1 9(14) => 10(24)
1 2 3 4 => 1 2 7(7) => 3 7(10) => 10(20)
括號裡面為總代價可以看出,第一種方法的代價最低,現在給出n堆石子的數量,計算最小合併代價。
input
第1行:n(2 <= n <= 100)
第2 - n + 1:n堆石子的數量(1 <= a[i] <= 10000)
output
輸出最小合併代價
input示例
4 1
2 3
4 output示例
19 1022
石子歸併v2n
堆石子擺成乙個環。現要將石子有次序地合併成一堆。規定每次只能選相鄰的
2堆石子合併成新的一堆,並將新的一堆石子數記為該次合併的代價。計算將
n堆石子合併成一堆的最小代價。
例如:1 2 3 4
,有不少合併方法
1 2 3 4 => 3 3 4(3) => 6 4(9) => 10(19)
1 2 3 4 => 1 5 4(5) => 1 9(14) => 10(24)
1 2 3 4 => 1 2 7(7) => 3 7(10) => 10(20)
括號裡面為總代價可以看出,第一種方法的代價最低,現在給出
n堆石子的數量,計算最小合併代價。
input第1
行:n(2 <= n <= 1000)
第2 - n + 1:n
堆石子的數量(
1 <= a[i] <= 10000)
output
輸出最小合併代價
input
示例4 1
2 3
4output
示例19 第一題比較好寫,複雜度是n3,但是第二題就需要用到四邊形不等式優化,把複雜度降為n2。
《演算法競賽入門經典訓練指南-劉汝佳》p170(老版)
書中在討論最優排序二叉樹時提到四邊形不等式優化方法。一般地,對於類似的狀態轉移方程:
d[i,j] = max + w[i,j]
狀態有o(n2 )個,每個決策有o(n),因此時間複雜度為o(n3)。
下面把它優化到o(n2)。
四邊形不等式(monge condition / quadrangle inequality)如果對於i ≤ i' < j ≤ j' 總有w[i,j] + w[i' ,j' ] ≤ w[i' ,j] + w[i ,j'],稱w滿足四邊形不等式,或w滿足凸性。
區間包含格上的單調性如果對於i ≤ i' < j ≤ j' 總有w[i' ,j] ≤ w[ i , j' ],稱w滿足單調性,也就是說對於兩個區間q1,q2(q2包含q1),w[q1] ≤ w[q2]。
定理(f.yao):若w滿足四邊形不等式,則d也滿足四邊形不等式,即
d[i,j] + d[i' ,j' ] ≤ d[ i' ,j] + d[ i ,j' ] , i ≤ i' ≤ j ≤ j'
證明略。
更進一步地,d的凸性可以推出決策單調性。記k[i,j]為讓d[i,j]取最小值的決策,有
定理(f.yao):k[i,j] ≤ k[i,j + 1] ≤ k[i + 1,j + 1], i ≤ j,即k在同行同列都是遞增的。
證明:由對稱性,只需證明k[i,j] ≤ k[i,j + 1]。記dk[i,j] = d[i,k − 1] + d[k,j] +w[i,j],則只需證明對所有的i < k ≤ k' ≤ j,如果dk'
[i,j] ≤ dk [i,j],那麼dk'
[i,j + 1] ≤dk [i,j + 1],即:區間加長乙個單位後,以前較好的決策現在仍然好。事實上,可以證明乙個更強的結論:dk
如上圖,設k' 是[i,j]的最優值,則對於它左邊的任意k,k' 在[i,j]上更優意味著k' 在[i,j+1]上仍最優,因此k' 左邊的任意k在[i,j+1]上仍然不是最大值,即k[i,j + 1] ≥ k[i,j]。
欲證dk [i,j] – dk'
[i,j] ≤ dk [i,j + 1] – dk'
[i,j + 1](i < k ≤ k' ≤ j),
移項得:dk [i,j] +dk'
[i,j + 1] ≤ dk [i,j + 1] + dk'
[i,j]。
按定義展開,兩邊消去w[i,j] + w[i,j + 1] + d[i,k −1] + d[i,k 0 − 1]得:
d[k,j] + d[k' ,j + 1] ≤ d[k,j + 1] + d[k' ,j]
這就是d的凸性。
有了決策單調性,可以稍微改造一下程式,決策從k[i,j−1]列舉到k[i+1,j]即可。
這樣做時間複雜度降低了嗎?當l = j − 1固定時,
d[1,l + 1]的決策是k[1,l] ∼ k[2,l + 1]
d[2,l + 2]的決策是k[2,l + 1] ∼ k[3,l + 2]
d[3,l + 3]的決策是k[3,l + 2] ∼ k[4,l + 3]
d[4,l + 4]的決策是k[4,l + 3] ∼ k[5,l + 4]
合併起來,當l固定時總決策為k[1,l] ∼ k[n−l+1,n],共o(n)個。由於l有o(n),因此總時間複雜度降為o(n2 )。
以上所給出的狀態轉移方程只是一種比較一般的,其實,很多狀態轉移方程都滿足四邊形不等式優化的條件。
解決這類問題的大概步驟是:證明w
滿足四邊形不等式,這裡w是
m的附屬量,形如
m[i,j]=opt
,此時大多要先證明
w滿足條件才能進一步證明
m滿足條件
證明m滿足四邊形不等式
證明s[i,j-1]≤s[i,j]≤s[i+1,j]
不管m[i,j]=opt
的opt
是min
還是max
,每一步的決策從
k[i,j−1]列舉到k[i+1,j]即可。
這樣就能降低複雜度了。就51nod這道題來說,它的步驟也是如此。
四邊形不等式優化DP
記錄一下,以免忘了 對於乙個形如 dp i j min dp i k dp k j w i j 的轉移方程 注意取最大值時不一定滿足四邊形不等式 若對於 a leq b leq c leq d 且 w leq w 那麼我們稱 w 關於區間包含關係單調 若對於 a leq b leq c leq d ...
四邊形不等式優化dp
對四邊形不等式優化dp的理解 四邊形不等式適用於優化最小代價子母樹問題,即f i j max min f i k 1 f k j w i j 類似列舉中間點的 dp問題,典型例題石子歸併 如果w函式滿足區間包含的單調性和四邊形不等式,那麼函式 f也滿足四邊形不等式,如果 f滿足四邊形不等式,s i ...
四邊形不等式優化dp
原文 在動態規劃中,經常遇到形如下式的轉台轉移方程 m i,j min w i,j i k j min也可以改為max 上述的m i,j 表示區間 i,j 上的某個最優值。w i,j 表示在轉移時需要額外付出的代價。該方程的時間複雜度為o n 3 下面我們通過四邊形不等式來優化上述方程,首先介紹什麼...