使用範圍:區間序列\(dp\)求最小值(一定是最小值)
對於動態規劃轉移方程
dp[i][j]=min(dp[i][k],dp[k+1][j])+w(i,j);
其中\(w(i,j)\)只受\(i,j\)取值影響
如果滿足下面兩個條件
\(1.\)區間單調性:如果對於\(\forall i \leq i'< j' \leq j,w(i',j') \leq w(i,j)\)(即小區間取值\(\leq\)大區間取值)
\(2.\)四邊形不等式:\(\forall i \leq i'< j' \leq j,w(i,j)+w(i',j')\leq w(i',j)+w(i,j')\)
即中的紅線總長\(\geq\) 藍線總長
如果\(w(i,j)\)同時滿足區間單調性和四邊形不等式
那麼\(f(i,j)\)滿足四邊形不等式
令\(s(i,j)\)為\(f(i,j)\)在取到最優解時的決策點\(k\)
那麼決策本身具有單調性,即滿足\(s(i,j)\leq s(i,j+1)\leq s(i+1,j+1)\)
用\(j\)代替\(j+1\)得到
\(s(i,j-1)\leq s(i,j)\leq s(i,j+1)\)
轉移方程變為
\(f(i,j)=min(f(i,k)+f(k+1,j))+w(i,j);\ (s(i,j-1)\leq k\leq s(i+1,j))\)
可以證明,他將時間複雜度降到了\(o(n^2)\)
什麼時候使用四邊形不等式?
只需要牢記公式
\(s(i,j-1)\leq s(i,j)\leq s(i,j+1)\)考試時可以打一張決策表看是否滿足上面式子,滿足可以使用四邊形不等式
\(1.\)序列\(dp\)有時可以使用四邊形不等式優化,但僅僅是常數優化
\(2.\)需要注意四邊形不等式僅針對求最小值的情況
\(3.\)注意\(s\)陣列(下標取值範圍)需要初始化,\(s[i][i]=i\)
p1880石子合併
這道題的四邊形不等式非常裸,但要注意求最大值不能用四邊形不等式,注意到最大值可以使用決策單調性優化
求最大值時\(f[i][j]\)一定是從\(f[i][j-1]\)或\(f[i+1][j]\)轉移過來的,所以可以將第三維優化掉
#include#include#define maxn 2005
#define inf 0x3f3f3f3f
#define re register
using namespace std;
int a[maxn],sum[maxn];
int f1[maxn][maxn],f2[maxn][maxn];
int s[maxn][maxn];
int n,tmp,pos,tmp2;
int ans1=0x3f3f3f3f,ans2;
int main()
for(re int i=1;i<=2*n;++i)
for(re int i=2*n-1;i>=1;--i)
for(re int j=i+1;j<=2*n;++j)
}for(re int i=1;i<=n;++i)
printf("%d\n%d",ans1,ans2);
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 下面我們通過四邊形不等式來優化上述方程,首先介紹什麼...