四邊形不等式優化DP學習小記

2021-07-23 22:55:02 字數 1988 閱讀 8743

有一種dp可以寫成四邊形不等式,那麼可以用乙個優化來優化這種dp(一般是二維的,不加優化是o(

n3) )。如果a

≤b≤c

≤d,那麼如果dp式子滿足f(

a,c)

+f(b

,d)≤

f(b,

c)+f

(a,d

) ,那麼這就是乙個四邊形不等式。

題意

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堆石子的數量,計算最小合併代價。

n≤1000

簡單dp思路

設f(i,j)為從i合併到j的最小值,列舉中間值k, 那麼f

[i,j

]=mi

n(f[

i,j]

,f[i

,k]+

f[k+

1,j]

+sum

[i,j

])這個東西明顯是o(

n3)

怎麼優化

首先可以發現,上面這個式子很顯然滿足四邊形不等式。 設g

(i,j

) 為f(

i,j)

選用的k 。

那麼滿足不等式 1、g

(i,1

)≤g(

i,2)

≤...

...≤

g(i,

n−1)

≤g(i

,n)2、

g(1,

i)≤g

(2,i

)≤..

....

≤g(n

−1,i

)≤g(

n,i)

這兩個都很顯然。

那麼我們觀察一下g(i,j)的範圍,它滿足兩個不等式: 1、g

(i,j

−1)≤

g(i,

j)2、g(

i,j)

≤g(i

+1,j

) 得出結論g(

i,j−

1)≤g

(i,j

)≤g(

i+1,

j)那麼我們在轉移f(i,j)的時候,k在這個範圍內列舉就可以了。

g的初始化:g(i,i)=i。

時間複雜度

這樣可以把時間複雜度降到o(

n2) 。

感性的證明一下,因為g是單調的,所以列舉的k一共就n個。

code

#include

#include

#include

#include

#include

#include

#define fo(i,a,b) for(i=a;i<=b;i++)

using

namespace

std;

const

int maxn=2007;

int i,j,k,l,t,n,m,ans,p;

int a[maxn],sum[maxn];

int f[maxn][maxn],g[maxn][maxn];

int main()}}

}printf("%d\n",f[1][n]);

}

什麼證明比較感性的就不要嘲諷我了。

四邊形不等式優化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 下面我們通過四邊形不等式來優化上述方程,首先介紹什麼...