學習筆記 斜率優化

2022-02-23 20:38:16 字數 2141 閱讀 4358

斜率優化入門題:

設\(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_j=f(j+1)\),原式可以寫成:

\[dp(i)= y_j+x_jt(i)

\]轉換一下式子

\[y_j=-t(i)x_j+dp(i)

\]現在問題就變成了確定了乙個\(i\),要快速查詢前面的乙個\(j\)使得\(dp(i)\)最小

把這個東西看成一條直線,就變成了我有一條在平面上平移的斜率為\(-t(i)\)的直線,現在要找乙個點\((x_j,y_j)\)使得過這個點的斜率為\(-t(i)\)的直線的截距盡量小。

藍線:斜率為\(-t(i)\)的線

紫點:\((x_j,y_j)\)

很明顯,可以看做有一條在\(y\)負半軸無限遠處有一條直線慢慢上移(截距慢慢變大),這條直線突然經過乙個我們集合內的點時,它此時的截距就是最小的截距。很顯然,這個點一定在凸包上面,而且這個點左右兩邊的斜率一定是左邊更小,右邊更大(斜率是負數)。

動態維護一下凸包就好了。

//@winlere

#include#include#include#includeusing namespace std; typedef long long ll;

inline int qr()

int n,s;

const int maxn=3e5+5;

int ti[maxn],fi[maxn];

ll st[maxn],sf[maxn];

ll x[maxn],y[maxn],q[maxn],dp[maxn];

int cnt;

inline ll getval(const int&i,const int&j)

inline bool chek0(const int&i,const int&j,const ll&k)

inline bool chek(const int&i,const int&j,const ll&k)

inline int lookup(const ll&k)

return q[ret];

}int main()

cout

\[dp(i,j)=\min\

\\sum(i)=\sigma_^it_j-dis(1,j)

\]拆開\(j,k\)直接變成乙個斜率優化的套路式。

\(x_k=k,y_k=dp(i-1,k)+sum(k)\)

原式變為:

\[y_k=t_jx_k+(dp(j)-j\times dis(1,j)+sum(j))

\]查詢乙個截距最小值。好像要單調佇列維護。查到哪個\(k\)轉移套到原式就好了。

不過這裡複雜度貌似\(o(n)(k\le 100)\)

//@winlere

#include#include#include#include#includeusing namespace std; typedef long long ll;

inline ll qr()

const int maxn=1e5+5;

int n,m,p;

int dis[maxn];

ll sumd[maxn];

ll sumdata[maxn];

ll x[maxn];

ll y[maxn];

ll dp[101][maxn];

struct node

inline bool operator

q.clear();

for(register int i=1;i<=m;++i)

}cout瓦努霍格木茨格蘭芬多神威無敵無雙超神大聚聚yyb的部落格

學習筆記 斜率優化

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

學習筆記 斜率優化

感謝cxl的部落格,講得很清楚 斜率優化的特點在於可以在權值 w i,j 中可以找到一項 f i times g j 的項,其中 j 是決策點,這時我們不能用單獨的單調佇列來優化因為這裡沒有單調性。決策單調性的定義 對於形如 f i min f j w j,i 的狀態轉移方程,記 p i 為 f i...

斜率優化學習筆記

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