決策單調性胡扯筆記

2022-03-26 19:32:44 字數 1986 閱讀 4993

2019 年,第一屆 csp 認證的考場上,作為選手的asuldb開啟了第二題。經過一番觀察,他認為這道題存在決策單調性,於是開始亂寫最終發現過不了樣例。

最終asuldb對該題設計出了乙個暴力程式,對於一組規模為\(u\)的資料,該程式的執行時間極有可能是\(u^2\),之後又由於asuldb寫錯了輸出,他只獲得了60pts的好成績。

之後他得知這道題只是乙個普通的單調佇列優化,於是他自閉了。

於是自閉的asuldb前幾天決定來學一學決策單調性,看看決策單調性到底是個什麼東西

大致可以分成兩種策略

一、分治

主要用於優化滿足決策點單調,且同一層dp值無關的問題,即\(dp_i=\max_+w_\leq w_+w_\)那麼就會存在決策點單調可以使用分治的策略優化

具體的分治方法就是我們對於乙個區間\([l,r]\)我們取其中點\(mid\)在相應的決策點區間\([x,y]\)找到最優的決策點\(k\),那麼\([l,mid-1]\)的可能決策點區間就是\([x,k]\),\([mid+1,y]\)的可能決策點區間就是\([k,y]\);分治這兩個區間就好了,複雜度顯示是\(o(n\log n)\)的

一道經典的例題cf868f

首先來證明一下為什麼會滿足四邊形不等式,我們找到一組\(a\leq b\leq c\),使得\(d\)從\(c\)開始遞增,對於\(w_+w_\),\(d\)每增加\(1\)產生的貢獻是\([b,c],[a,d-1]\)裡和\(d\)相同的數的個數;這個數顯然要少於\([a,c],[b,d-1]\)裡和\(d\)相同的個數,於是有決策單調性,我們可以使用分治的策略解決這個問題

**

#include#define re register

#define ll long long

const int maxn=1e5+5;

inline int read()

int n,m,l,r,a[maxn],tax[maxn];

ll g[maxn],dp[maxn],nw;

inline void add(int c,int v)

inline ll calc(int l,int r) =\max_dp_+a_i(s_i-s_j+1)^2\),其中\(s_i=\sum_^i[a_j=a_i]\)

我們思考一下其中的決策單調性,對於\(i\)這個位置,如果存在\(j,k,j這樣的兩個轉移,這個時候\(j\)轉移已經要優於\(k\)轉移了,那麼對於比\(i\)更大的位置,\(j\)轉移還是要優於\(k\),因為\(j\)的增長速度要快於\(k\)

於是我們可以維護乙個儲存決策點的棧,設\(f(j,k)\)表示決策\(j\)最早在什麼時候好於決策\(k\),這個可以在乙個\(\log\)時間內二分求出,那麼這個棧中任意三個連續元素\(j,k,l\)肯定會滿足\(f(j,k)>f(k,l)\);否則\(k\)這個決策點就太沒用了,在\(k\)比\(l\)優的時候已經有乙個比\(k\)更優的了,這樣\(k\)永遠也不會是最優決策了,對於這樣的\(k\)我們不應該留在棧中

於是這道題我們對於每一種顏色維護乙個單調棧就好了,複雜度\(o(n\log n)\)

#include#define re register

#define ll long long

#define lst(x) stk[x][stk[x].size()-1]

#define lst(x) stk[x][stk[x].size()-2]

inline int read()

const int maxn=1e5+5;

int a[maxn],p[maxn],tax[10005],n;

ll dp[maxn];

std::vectorstk[10005];

inline ll trans(int x,int c)

inline int chk(int a,int b)

return nw;

}int main()

printf("%lld\n",dp[n]);return 0;

}

決策單調性

dp min dp w l,r 若 w l,r 滿足 則 dp 滿足四邊形不等式,其決策點 op 滿足 op le op le op 複雜度降至 mathcal o n 2 eg.合併石子 dp min w l,r 若 w l,r 滿足四邊形不等式,則決策具有單調性。對決策區間分治,具體來說,每次求...

決策單調性優化DP 分治優化決策單調性

前言 本來這篇已經寫了 frac 了 然後我關機時忘儲存了。華麗的分割線 對於類似於 dp i j max min dp k 1 j 1 count k,i 不妨設 當 最後一次 max min 更新時 f i,j k 若有 forall i,j in 1,n s.t.i j rightarrow ...

決策單調性優化DP學習筆記

廢話,當然是在dp式子滿足某些性質的時候來優化複雜度 對於 j 往大於 j 的 i 轉移,可以表示成乙個關於 i 的函式 f j i 也就是 dp i max min 若是取 max 並且在某乙個地方 f j i 從下面跑到了 f k i 的上面 如果加入 f j i 這個函式時本來就在 f k i...