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