1. 程式人生 > >[dp專題-四邊形不等式優化]51nod 1022

[dp專題-四邊形不等式優化]51nod 1022

1021石子歸併 V1

N堆石子擺成一條線。現要將石子有次序地合併成一堆。規定每次只能選相鄰的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石子歸併 V2

N堆石子擺成一個環。現要將石子有次序地合併成一堆。規定每次只能選相鄰的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行:N2 <= N <= 1000)

2 - N + 1N堆石子的數量(1 <= A[i] <= 10000)

Output

輸出最小合併代價

Input示例

4

1

2

3

4

Output示例

19

第一題比較好寫,複雜度是n3,但是第二題就需要用到四邊形不等式優化,把複雜度降為n2

《演算法競賽入門經典訓練指南-劉汝佳》P170(老版)

書中在討論最優排序二叉樹時提到四邊形不等式優化方法。一般地,對於類似的狀態轉移方程:

    d[i,j] = max{ d[i,k−1] + d[k+1,j] } + 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 [i,j]−d k'[i,j] ≤ d k [i,j +1]−dk' [i,j +1](i <k ≤ k' ≤ j),因為當k'在[i,j]更優時,左邊≥0,由不等式知右邊≥0,因此k'仍更優。

如上圖,設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(n 2 )。

擴充套件

以上所給出的狀態轉移方程只是一種比較一般的,其實,很多狀態轉移方程都滿足四邊形不等式優化的條件。

解決這類問題的大概步驟是:

  1. 證明w滿足四邊形不等式,這裡wm的附屬量,形如m[i,j]=opt{m[i,k]+m[k,j]+w[i,j]},此時大多要先證明w滿足條件才能進一步證明m滿足條件
  2. 證明m滿足四邊形不等式
  3. 證明s[i,j-1]≤s[i,j]≤s[i+1,j]

不管m[i,j]=opt{m[i,k]+m[k,j]+w[i,j]}optmin還是max,每一步的決策從k[i,j−1]列舉到k[i+1,j]即可。這樣就能降低複雜度了。就51nod這道題來說,它的步驟也是如此。