學習筆記 斜率優化

2022-05-11 15:34:21 字數 2196 閱讀 8432

感謝cxl的部落格,講得很清楚:

斜率優化的特點在於可以在權值 \(w(i,j)\) 中可以找到一項 \(f(i)\times g(j)\) 的項,其中 \(j\) 是決策點,這時我們不能用單獨的單調佇列來優化因為這裡沒有單調性。

決策單調性的定義:對於形如 \(f[i]=\min _(f[j]+w(j,i))\) 的狀態轉移方程,記 \(p[i]\) 為 \(f[i]\) 取到最小值時 \(j\) 的值,\(p[i]\) 即為 \(f[i]\) 的最優決策。如果 \(p[i]\) 在 \([1,n]\) 上單調不減,則稱 \(f\) 具有決策單調性。斜率優化的 \(w\) 函式都包含一項 \(g_i \times q_j\),通常以 \(g_i\) 作為斜率。

引入:[zjoi2007]倉庫建設

顯而易見的dp,很顯然又是乙個區間劃分問題。

容易推出 \(o(n^2)\) 的dp方程:令 \(g_i=-\sum_^a_j\times p_j\),\(p_i=\sum_^p_j\),有 \(f_i=\min_^\ + c_i + g_ + f_j - g_j - a_i \times p_\}\),其中 \(f_i\) 代表從 \(1\) 到 \(i\) 在 \(i\) 處結束的最小費用,顯然答案是 \(f_n\)。如果沒有看懂dp方程也沒關係,反正是學斜率優化的套路,先假裝自己已經知道了這個方程就好。但是這題 \(1\le n\le 10^6\) 這種方法無法通過此題。考慮用單調佇列優化dp的套路,把 \(i\) 和 \(j\) 區分開來(其實我已經幫你們區分好了),因為有關 \(i\) 的都可以看作常數所以我們可以不管它,這樣dp方程化成了 \(f_j-g_j-a_i\times p_\),如果直接用單調佇列維護是沒有單調性了,因為對於不同的 \(i\) 有不同的 \(a_i\),這就是斜率優化的標誌。

這我們用線性規劃的角度來解決這個問題,將其表達為座標系上的直線和點,其中 \(f_i\) 是截距,\(a_i\) 是斜率,\((p_,f_j-g_j)\) 是決策點,顯然對於乙個斜率和乙個決策點即可確定這條直線,而我們現在要做的就是最小化截距。顯然我們的最優決策點一定是在下凸包上的(如果要求最大值則在上凸包),且這個凸殼與直線的切點即為最優決策點,這裡借用cxl的一張圖:

當然這還有代數法的嚴格證明。

while (head < tail && slope(q[tail - 1], q[tail]) > slope(q[tail], i)) tail--;

q[++tail] = i;

那麼如何找到切點?即為在凸包上兩點斜率第乙個比直線斜率大的點。如上圖的 \(\text\)。因為凸包的斜率是單調的,而這題直線的斜率也是單調的所以如果前面的決策點對直線不行的話就可以直接捨掉了。

f[i] = a[i] * p[i - 1] + c[i] + g[i - 1];

while (head < tail && slope(q[head], q[head + 1]) < (double)a[i]) head++;

f[i] = f[i] + f[q[head]] - g[q[head]] - a[i] * p[q[head]];

顯然每個決策點只會進隊出隊各一次所以時間複雜度為 \(o(n)\)。

習題[hnoi2008]玩具裝箱

[apio2010]特別行動隊

[apio2014]序列分割

cats transport

[ceoi2004]鋸木廠選址

[sdoi2016]征途

[sdoi2012]任務安排

看一道這樣的題,在我們列出套路的式子後發現這個斜率並不單調,也就是說這個題不具有決策點調性,也就是說我們無法用單調佇列來維護。但是這個凸殼的斜率還是有單調性的,所以我們可以考慮在凸殼上二分。

int l = head, r = tail - 1, ans = tail;

while (l <= r) else

}

時間複雜度為 \(o(n\log)\)。

【演算法】斜率優化高階

兩個點橫座標相同時如果 \(y(j)\ge y(i)\) 則返回正無窮,否則返回負無窮是必要的。

要注意斜率和橫座標是否有單調性

維護單調佇列時如果等於最好也出隊

要保證佇列中有至少乙個元素(如果沒有切點的話這個點也是最有決策點)

學習筆記 斜率優化

斜率優化入門題 設 f x 為 f x 的後綴和,t x 為 t x 的字首和。dp i 表示完成到第 i 任務的最小代價,轉移 dp i min 拆掉 我們發現只和 j 相關的可以直接預處理,現在的問題是確定了 i 如何快速找到乙個 j 令 y j dp j f j 1 times s t j x...

學習筆記 斜率優化

太久沒碰過這個玩意了,於是它就變成學習筆記了。一般來說,斜率優化的dp會比其它的dp得到轉移方程要簡單一點點。通式大概是 f i a i b j c i d j 也就是說,這種dp和單調佇列不同的一點是有同時和 i,j 有關的項,這時候就需要用到斜率優化。拿道題目來講可能效果更好一些。設字首和為 s...

斜率優化學習筆記

目錄第二類斜率優化 注意事項 q a 例題 hnoi玩具裝箱 由題意我們可以馬上得到dp方程 dp i displaystyle min sum x 為字首和 很可惜,這個解法是 o n 2 的,無法ac 但是可以在當年騙很多分?接下來的文章中我們會用幾個簡稱 f i sum i i c 1 l 優...