# dp 優化 --- ## 回顧一下dp在做什麼 把大問題切成(會重複用到的)子問題 狀態和轉移 ---- ## 先講一些上次沒講的技巧 ---- ## [置換](https://atcoder.jp/contests/dp/tasks/dp_t) ---- 發現到一個$[1,n]$的置換其實可以看成已經有一個$[1,n+1]$的接著在最後面$+$一個$x$最後在把前面$\geq x$的都$+1$。 ---- 把$dp[i][j]$設成前面有$[1,i]$的置換,最後一項是$j$的個數。 轉移就好好看大小 ---- ## [開關區間](https://cses.fi/problemset/task/1665) ---- 發現到貢獻需要知道的只有每個人是不是最大或最小的 由大到小加進來 $dp[i][j][k]$是看了最大的$i$個人現在有$j$個人當最大值而且他們還沒有配到最小值,$k$是現在的貢獻的個數 --- ## dp優化想做什麼 在一些有著好性質的dp 我們利用好性質去偷懶 ---- ## 最簡單的例子 greedy ---- ## 單調隊列優化 ---- ## sliding window 長為$n$的數列$a_i$,問每個長為$k$的區間裡的最大值。 單調隊列。 好事情:轉移的範圍幾乎沒有變。 ---- ## 有限個數多重背包 有$n$種物品,每個物品有重量$w_i$價值$v_i$個數$a_i$,背包承重$W$。 ---- 合併物品變01背包 $O(W\sum\log(a_i))$ ---- 狀態和01背包一樣 轉移:$dp_{i,j}=\displaystyle\max_{0\leq x\leq a_i}(dp_{i-1,j-xw_i}+xv_i)$= 對$j$ mod $w_i$ 做sliding window ---- ## 題目 - [題](https://codeforces.com/problemset/problem/372/C) --- ## 矩陣 算費氏數列第$i$項模$p$ 發現到 $\begin{pmatrix}0 & 1\\ 1& 1 \end{pmatrix}\begin{pmatrix}F_i \\F_{i+1} \end{pmatrix}=\begin{pmatrix}F_{i+1} \\F_{i+2} \end{pmatrix}$ 矩陣有結合率 那我們就可以做快速冪 ---- 記得矩陣的運算可以亂改(我們只有用到結合率) ---- [沒吃毒](https://slides.com/becaido/dp-op#/3/7/0) [吃毒](https://slides.com/becaido/dp-op#/3/10/0) --- ## 斜率優化 [偷偷偷](https://slides.com/becaido/dp-op#/2) ---- ## 優超性 我們說 $f$ 優超 $g$ 如果 $\exists p$ 使得 $f(x)>g(x)\,\forall x<p$ $f(x)\leq g(x)\,\forall x\geq p$ ---- ## 1d/1d $dp_j=\displaystyle\min_{0\leq i<j}\{f(i,j,dp_i)\}=\min_{0\leq i<j}\{f_i(j)\}$ 如果有$f_i$優超$f_j\,\forall i<j$我們說他是凹單調的 如果有$f_i$優超$f_j\,\forall i>j$我們說他是凸單調的 ---- 發現到他基本上就是斜率優化 可以用李超 但詢問單調而且贏的方向單調 所以能用deque去維護(在凹的時候可以只用stack) 在判交點的時候要二分搜 ---- ## monge $f_i(j)+f_{i+1}(j+1)\geq f_i(j+1)+f_{i+1}(j)$的話 他就是凸單調 反過來就凹 monge比單調性還要緊,所以不能從單調推monge ---- ## 題目 - [黑白機](https://tioj.ck.tp.edu.tw/problems/2231) - [偶像選拔祭](https://tioj.ck.tp.edu.tw/problems/2328) - [暴雷](https://oj.uz/problem/view/APIO24_train) --- ## [knuth](https://cp-algorithms.com/dynamic_programming/knuth-optimization.html) [例題](https://cses.fi/problemset/task/2088) 設$[l,r]$被切在$opt(l,r)$ $opt(l,r)\leq opt(l,r+1)\leq opt(l+1,r+1)$ 以長度大小掃 每個長度只要掃$O(n)$ 總共$O(n^2)$ --- ## 轉移點單調 現在在做1d/1d,我們有的只有最佳轉移點會遞增 ---- ## 費用可以離線 做分治 假設divide(x,y,l,r)能做完$[x,y]$轉到$[l,r]$ 花$O(y-x)$能找到中點m的最佳轉移點是opt 那要再做divide(x,opt,l,m-1), divide(opt,y,m+1,r) 複雜度分析和knuth差不多 ---- ## 現在要在線了 [cdq](https://oi-wiki.org/misc/cdq-divide/): 做完$[l,m]$ 拿$[l,m]$去轉$[m+1,r]$ 做$[m+1,r]$ --- ## slope trick [偷](https://codeforces.com/blog/entry/77298) 左邊是$y=ax+b$經過一個$+1$斜率的點$p$會變 $y=(a+1)x+(b-p)$ --- ## aliens [8e7好強](https://slides.com/justinlai2003/dp-dp#/7) ---- ## 題目 - [aliens](https://tioj.ck.tp.edu.tw/problems/1961) - [暴雷](https://oj.uz/problem/view/JOI23_chorus)
{"contributors":"[{\"id\":\"80534ff6-e4c7-48c5-88c7-d13ac225a4c2\",\"add\":3419,\"del\":666}]","title":"dp 優化","description":"在"}
    500 views