1. 程式人生 > 其它 >資料結構優化DP

資料結構優化DP

有些時候狀態轉移的時候一堆候選決策不知道怎麼辦?
使用迴圈?會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\)

在a的位置,對於b來說這幾個位置是發生轉移的位置
在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}\)
然後按第一個式子升序,第二個開樹狀陣列維護就行了