資料結構優化DP
阿新 • • 發佈:2022-05-15
有些時候狀態轉移的時候一堆候選決策不知道怎麼辦?
使用迴圈?會T飛的!
維護決策單調性?會出錯的!
倍增/狀壓?離正解遠了!
剩下的只有這一個優化方式了:
資料結構優化DP
有些決策暴力查詢複雜度很炸,不過放到資料結構題就是板子
這個時候,我們就可以寫一個數據結構,查詢決策就相當於查詢
這樣的話查詢決策的開銷就可以降低了!
來幾個題?
AHOI2006 基因匹配
這個題60部分分給到的是\(O(n^2)\)的LCSDP
考慮優化一下下:
\(f[i][j]=max(f[i-1][j],f[i][j-1],f[i-1][j-1]+(a[i]==b[j]))\)
這裡給到的每個數出現5次是關鍵特殊性質,
記錄每個\(i\)
在b中,狀態轉移方程就變成了:
\(f[pos[x][j]]=max(f[i]+1),i∈[1,pos[x][j]-1]\)
這裡就可以用維護區間最值的資料結構維護了
特殊性質:\(i∈[1,x],x∈Z\),樹狀陣列搞一下就行
直接壓到\(O(nlogn)\)
USACO Cleaning Shifts
線段覆蓋問題上資料結構優化
狀態轉移方程:
\(f[r]=min(f[r],min(f[x]+w)),x∈[l-1,r]\)
快速維護\(min(f[x])+w\),這裡手段就很多了
線段樹維護區間最值
NOI1998 免費餡餅
加強版 \(N=1e5\)
狀態轉移方程很好列:
\(f[i]=max(f[i],f[j]+1),\forall j,|P_i-P_j|\in[0,2*(t_i-t_j)]\)
但是暴力轉移是\(O(n^2)\)的,\(N=1e5\)
考慮優化
狀態幹不動,決策幹不動,轉移條件?
拆成一個不等式組
\(\begin{cases}
p_i-2t_i<p_j-2t_j,p_i<p_j\\
p_i+2t_i>p_j+2t_j,p_i>p_j
\end{cases}\)
然後按第一個式子升序,第二個開樹狀陣列維護就行了