目錄一維線性dp的優化
二維區間遞推優化
定義存在二元函式\(w(x,y)\) ,其定義域為\(i\),
若對於任意\(a,b,c,d\in i且a≤b≤c≤d\),\(w(a,d)+w(b,c)≥w(a,c)+w(b,d)\)恆成立
則稱\(w\)滿足四邊形不等式。
判定定理
若對於任意\(a,b\in i且a<b\),\(w(a,b+1)+w(a+1,b)≥w(a,b)+w(a+1,b+1)\)恆成立
則w滿足四邊形不等式。
可以感性理解一下吧:\(a,只有等號問題並不影響。
轉移模型
\[f[i]=\min_{0≤j
證明:
設k,k′為\(f[i]\)的決策點並滿足條件\(0≤k′′不難得知
\(f[i]=f[k]+w(k,i)≤f[k′]+w(k′,i)\)
由四邊形不等式得知
\(w(k′,i′)+w(k,i)≥w(k′,i)+w(k,i′)\)
兩式相加有
\(f[k]+w(k,i′)≤f[k′]+w(k′,i′)\)
於是易知決策點k比k′更優,故得證。
實現當前轉移\(f[i]\),單調佇列維護三元組\((l,r,p)\),表示l~r的最優決策點目前為p。
掐頭,若\(r=i-1\),彈出,否則\(l=i\)
取隊首計算
去尾,如果決策i在l處都比p優秀,則直接彈出p。
如果決策i在r處都不如p優秀,則直接插入p。
否則二分查詢l~r中第乙個可以讓決策點i更優秀的位置
更改隊尾r,把新的三元組代表i的決策加入佇列(注意有可能不能加入)
可以實現\(o(n^2)\to o(nlog_n)\) 。
轉移模型
\[f[l][r]=\min_{l≤k
定理:沒有證明。。
一:若對於上式中的w有
①w滿足四邊形不等式
②對於任意的\(a,b,c,d\in i且a≤b≤c≤d\) ,w滿足\(w(a,d)≥w(b,c)\)
則f滿足四邊形不等式。
二:若f滿足四邊形不等式,則:
對於任意決策\(i,都有下列二者之一:
\[p[i,j-1]≤p[i,j]≤p[i+1,j]\ (轉移中i倒序列舉,j正序列舉)\\
p[i-1,j]≤p[i,j]≤p[i,j+1j]\ (轉移中i正序列舉,j倒序列舉)\\
p為各個狀態的最優決策
\]實現
一般而言,都是直接把第三重迴圈的邊界依情況改成上面的二式之一即可。
可以實現\(o(n^3)\to o(n^2)\) 。
對於此類優化,一般先大膽猜想,然後打表驗證!!
決策單調性 四邊形不等式
include define maxn 10000 10 using namespace std int dp maxn maxn s maxn maxn cnt maxn int main dp i j temp s i j te cout 題目 n 堆石子。現要將石子有次序地合併成一堆,規定每次...
四邊形不等式
總結一下最近幾天對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 ...