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