蒟蒻關於斜率優化DP簡單的總結

2022-03-20 09:12:08 字數 1307 閱讀 2042

upd:這裡是yyb的更新,今天是2019.3.18的晚上。

我覺我的這篇文章就是在扯蛋,所以到這裡看斜率優化把qwq。

考試的時候被這個玩意弄得瑟瑟發抖

大概是yybgg的day4

小蒟蒻表示根本不會做.....

然後自己默默地搞了一下斜率優化

其實我講的會非常非常非常簡單,,,而且絕對沒有一張圖(因為我繪圖水平太菜)

貌似沒太多友善的題目可以用來搞....算了

虛一點,縹緲一點的來說吧....

對於某一類dp方程形如:(當然max也可以)

\[f[i]=min(f[j]+g(i,j))

\]其中\(g(i,j)\)

是乙個只和i於j相關的函式

我們知道

轉移一定是從某個位置轉移過來了,其他位置的轉移一定不會比這個位置好

所以,不妨設從j位置轉移過來,另外乙個奇怪的位置從k轉乙個過來

於是有:

\[f[j]+g(i,j)

接下來再假設一步

我們假設\(g(i,j)=h(i)t(j)\)

其中 \(h(i)\)和\(t(j)\)是只和i與j有關的函式

那麼不等式變為

\[f[j]+h(i)t(j)

移項得\[h(i)(t(j)-t(k))

\[h(i)<\frac

\]這個時候就看到右邊的東西沒有???

但是要記住,除過去可能會要變號

這玩意就可以視作乙個斜率啦

但是,這個玩意有了不能夠直接用嗷

只有當滿足單調的時候才能夠用斜率優化

當且僅當\(h(i)、f[i]、t(i)\)

都要滿足單調的時候才能夠用(根據取max或min,符號等單調性有所不同)

這個時候,利用單調佇列維護乙個凸包就可以啦

具體的類似**如下:

for(int i=1;i<=n;++i)

這是乙份比較偽的**

第乙個while迴圈,目的是彈出佇列頭位置的不合法的狀態(因為\(h(i)\)的值在變化)

中間的兩句話是轉移,可以直接利用斜率優化\(o(1)\)轉移

後面那個while迴圈目的是維護單調性,當前的節點如果放進來會破壞隊尾的單調性,所以要進行調整

最後乙個是加入隊尾,繼續進行操作

這樣子的話就可以維護斜率進行斜率優化啦

有待補充

【bzoj1010】【hnoi2008】玩具裝箱

【bzoj1911】【apio2010】特別行動隊

【luogu2900】土地徵用

【bzoj1096】【zjoi2007】倉庫建設

蒟蒻 區間dp學習總結

例題 p1063 能量項鍊 p3205 hnoi2010 合唱隊 區間dp,顧名思義,在區間上dp,大多數題目的狀態都是由區間 類似於dp l r 這種形式 構成的,就是我們可以把大區間轉化成小區間來處理,然後對小區間處理後再回溯的求出大區間的值,主要的方法有兩種,記憶化搜尋和遞推。memset d...

蒟蒻 區間dp學習總結

例題 p1063 能量項鍊 p3205 hnoi2010 合唱隊 區間dp,顧名思義,在區間上dp,大多數題目的狀態都是由區間 類似於dp l r 這種形式 構成的,就是我們可以把大區間轉化成小區間來處理,然後對小區間處理後再回溯的求出大區間的值,主要的方法有兩種,記憶化搜尋和遞推。memset d...

蒟蒻 樹形dp學習總結

樹形dp,即基於樹的結構進行dp 一般來說樹形dp在設狀態轉移方程時都可以用f i 表示i這顆子樹怎麼怎麼樣的最優解,實現時一般都是用子樹更新父親 即從下向上更新 那麼首先應該考慮的是乙個乙個子樹的更新父親還是把所有子樹都算完了在更新父親?這就要因題而異了,一般來說有兩種情況 1.需要把所有子樹的資...