dp的四邊形不等式優化

2022-02-01 03:03:45 字數 2271 閱讀 8456

先來看一道題目:

有 \(n\) 堆石子排成一行,第 \(i\) 堆有 \(a_i\) 個石子每次選擇相鄰的兩堆石子,將其合併為一堆,記錄該次合併的得分為兩堆石子個數之和。已知每堆石子的石子個數,求當所有石子合併為一堆時,最小的總得分。

區間dp模板題。設 \(dp(i,j)\) 為區間 \([i,j]\) 的最小得分,則狀態轉移方程為:

\[dp(i,j) = \min_^\^j a_s\}

\]code:

#includeusing namespace std;

const int inf=1<<30;

int dp[1005][1005],a[1005],sum[1005]; //sum陣列為a陣列的字首和,這樣就能快速求出∑a_s(i<=s<=j)。

int main()

for(k=1;k容易看出,上面的**時間複雜度為 \(o(n^3)\),資料一旦大一點,就會導致 tle。

怎麼辦呢?我們來看**的迴圈部分:

for(k=1;k前兩層迴圈列舉距離和起點,無法優化,但是第三層迴圈尋找斷點是可以優化的。怎麼做呢?

可以再開乙個 \(s\) 陣列來記錄每個區間的最優斷點,然後變數 \(k\) (尋找斷點)每次只從 \(s(i,j-1)\) 迴圈到 \(s(i+1,j)\),這樣時間複雜度可以從 \(o(n^3)\) 降到近似 \(o(n^2)\)。

如何證明這樣的迴圈來找斷點是對的呢?

見下:(edited by charliezhi2007

)dp的平行四邊形不等式證明,m[i][j]即為dp[i][j],s[i][j]表示i~j的最優化斷點。

設a , b , c , d(a<=b<=c<=d) //結論是兩邊之和大於第三邊(四邊形)

m(a,c) + m(b,d) <= m(a,d) + m(b,c) //四邊形對邊相等

s[ i ][j-1] <= s[ i ][ j ] <= s[i+1][ j ]

s[ i ][ j ]<=s[i+1][ j ]思考

d=s[ i ][ j ] ,i < i + 1 <= k < d k<-[ i , j ] //設d為斷點位置,假設k小於d,k為i,j中任意斷點

mk(i,j) = m(i,k) + m(k + 1,j) + sum(i,j) //表示以k為斷點i,j合併的代價 sum是i到j所有值得和

md(i,j) = m(i,d) + m(d + 1,j) + sum(i,j) //表示以d為斷點i,j合併的代價(代價最小)

mk(i,j) >= md(i,j) > 0 //d為斷點將i,j合併的代價最小因為d是最優斷點

=> mk(i,j) - md(i,j) > 0

(mk(i + 1,j) - md(i + 1,j)) - (mk(i,j) - md(i,j)) //判斷k>d 或 d>k因為上面假設k將減號兩邊的m(k + 1,j) 和 m(d + 1,j) 和 sum(i,j) 和 sum(i + 1,j)相互消元

=(m(i + 1,k) + m(i,d)) - (m(i + 1,d) + m(i,k))

=> i0 //因ad+bc>=ac+bd所以該式大於0

=>(mk(i + 1,j) - md(i + 1,j)) - (mk(i,j) - md(i,j)) >0 //則這個也大於0

因d<=b 則b=s[i + 1][ j ]

下面求s[ i ][j-1]的思路於上面一致,則最終得出k∈[s[ i ][j-1] , s[i-1][ j ]]。

通過上述推論,可得出 \(s(i,j-1)\leq s(i,j)\leq s(i+1,j)\),再經過一波分析,可得出 \(s(i+1,j)-s(i,j-1)\) 小到幾乎可以忽略不計,所以上述程式的複雜度降到了 \(o(n^2)\)。

獻上醜陋ac**:

#includeusing namespace std;

const int inf=1<<30;

int dp[1005][1005],a[1005],sum[1005],s[1005][1005];

int main()

sum[0]=0;

for(i=1;i<=n;i++)

for(k=1;k}

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

return 0;

}

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