動態規劃加速原理之四邊形不等式
動態規劃的四邊形不等式優化是對特定形式的狀態轉移方程進行優化的一種方法,該方法可以將複雜度由 o(n
3)
o(n^3)
o(n3
) 優化到 o(n
2)
o(n^2)
o(n2)。
設我們有狀態轉移方程
m (i
,j)=
i
i=ji
nf
i>
jm(i ,j) =\left\ min \ & & \\ 0 & & i = j\\ inf & & i > j \end \right.
m(i,j)
=⎩⎨⎧
min
0inf
i=j
i>j
w 滿足區間包含的單調性:
如果對於 i <= i』 < j <= j』 都有 w(i』 , j ) <= w(i ,j』) ,那麼稱函式 w 滿足關於區間包含的單調性。
w 滿足四邊形不等式:
如果對於 i <= i』 < j <= j』 都有 w(i , j ) + w(i』 , j』) <= w(i 』 , j ) + w( i , j』 ),我們稱 w 滿足四邊形不等式。
m 滿足四邊形不等式:
如果 w 滿足區間包含的單調性,同時又滿足四邊形不等式,那麼 m 函式也滿足四邊形不等式。
m 滿足四邊形不等式的應用:
定義 s( i , j ) 為函式 m(i , j) 對應的決策變數的最大值。如果 m(i ,j) 滿足四邊形不等式,那麼 s(i , j) 單調。
原狀態轉移方程可表示為:
m (i
,j)=
m(i,
k−1)
+m(k
,j)+
w(i,
j)
m(i ,j) =
m(i,j)
=m(i
,k−1
)+m(
k,j)
+w(i
,j)其中 s(i
,j−1
)<=k
<=s
(i+1
,j
)s(i, j - 1) <= k <= s(i+1 , j)
s(i,j−
1)<=k
<=s
(i+1
,j) 。如此變將第三層列舉數量減少,時間複雜度優化到了 o(n
2)
o(n^2)
o(n2)。
例題例1:石子合併
題意描述
共 n 堆石子圍成一圈,每次可以選定相鄰兩堆合併成一堆,得分為合併後的新堆的石子數量,請問將這 n 堆石子合併成一堆的最小值是多少?
例2:hdu3480 division
題意簡述
給定 n 個元素,請將這 n 個元素分為 m 個集合,每個集合的得分為該集合內的(最大值-最小值)^2。請問最少得分是多少。
解題思路
因為我們可以任選元素放入子集,所以元素的順序沒有規定。我們將元素按照大小排序,這樣選中連續的 k 個一定是所有大小為 k 的子集中得分最少的。可以通過反證法來證明,將這 k 個元素中的任乙個替換都會使得得分增加。
可以用動態規劃來解決,設 f[i ,j] 表示將前 j 個元素分為 j 個集合最少得分。那麼 f[ i , j ] = min,其中 w 為計算集合得分的函式,1 <= k < i。
這樣做的時間複雜度為 o(n^3),由於本題資料過大,因此會超時,可以考慮是否能用四邊形不等式優化。
判斷是否能用四邊形不等式優化
假設 a <= b < c <= d;由於序列是順序排序,所以元素大小和下標成正比,因此用下標代替元素。
考慮 w( b , c) < w(a , d)是否成立:顯然由於元素是遞增的,所以 (d−
a)
2>(c
−b)2
(d - a)^2 > (c - b)^2
(d−a)2
>(c
−b)2
,即滿足區間包含的單調性。
考慮w(a , c) + w(b , d) <= w(a , d) + w(b , c)是否成立:
即 ( c−
a)2+
(d−b
)2
<=(
d−a)
2+(c
−b)2
(c-a)^2 + (d-b)^2 <= (d-a)^2 + (c-b)^2
(c−a)2
+(d−
b)2<=(
d−a)
2+(c
−b)2
是否成立;
化簡後即 ac+
bd
>ad
+b
cac + bd > ad + bc
ac+b
d>ad
+bc 是否成立;
即 b(d-c) >= a(d-c) 是否成立;
由於 d > c,b > a,所以 上式成立,原式得證。
綜上所述 w 函式既滿足區間包含單調性又滿足四邊形不等式,所以可以用四邊形不等式優化。
利用 s 陣列進行四邊形不等式優化
我們知道四邊形不等式的優化主要在於減少了中間狀態的列舉,我們設 s[i , j] 為 f[i ,j] 取最小值時的中間變數 k。
那麼我們狀態轉移方程就可以變成 f[ i , j ] = min,其中 s[i ,j-1] <= k < s[i+1 ,j] 。
初始化而言,f[i ,1] = w(i ,1),即把前 i 個元素分為乙個子集;s[i , 1] = 1,即前 i 個元素分為乙個子集時起點為 1 。
因為集合的劃分個數要從小到大,所以集合個數 j 就從 2 開始,放在最外層;第二層因為要用到 s[i+1 ,j] ,所以 i 要從後向前遍歷更新;中間就是利用 s 陣列進行四邊形不等式優化了。
在用 s 陣列替換原始範圍時,一定要注意範圍,尤其是邊界範圍是否一致,同時要注意 s 陣列的加入是否會影響更新順序。
**示例
參考資料#include
#include
const
int n =
1e4+10;
const
int m =
5010
;typedef
int ll;
ll a[n]
,f[n]
[m];
const ll inf =
0x3f3f3f3f
;int t,n,m,s[n]
[m];
ll getint()
inline ll w
(int l,
int r)
ll solve()
}return f[n]
[m];
}int
main()
四邊形不等式
總結一下最近幾天對dp優化中的四邊形不等式的學習。證明什麼的似懂非懂,我還是太年輕了。第一種,n 2 nlogn 例題 由於許可權問題 不公開題面 就是1個體積均為1 300,100000個物品,做乙個100000的揹包。發現體積最多只有 300 種,分開做。對於同種體積的物品,顯然按照價值從大到小...
四邊形不等式
若有函式 a i,j 令 i,若有 a i j a i 1 j 1 le a i j 1 a i 1 j 則我們稱函式 a 滿足四邊形不等式。若我們在 dp 過程中會用到類似如下形式的方程 dp i j min dp k j or dp i k dp k 1 j w i j 那麼,只要代價函式 w ...
四邊形不等式相關
四邊形不等式,即 w i j w i j w i j w i j 其中 i i j j 順便推薦兩篇 四邊形不等式 動態規劃演算法優化技巧 我是這麼總結的 1 狀態轉移方程形如 f i opt 其中b i j i 1 說明 b i 是根據題目描述的可以決策狀態i的左邊界,w j i 是狀態j轉移到狀...