HDU3507 斜率優化dp 入門

2021-09-13 11:21:33 字數 660 閱讀 9475

解題思路:第一次做斜率優化dp,參考了部落格使原本o(n^2)的複雜度變成o(n)。看完部落格之後,看了一下**發現**中(yj-yk)/(xj-xk) <= sum[i],只要碰到乙個不符合這個條件就用j來算dp[i]了。其實是這樣的,因為符合上面那個不等式,代表j在以後都會比k要優,所以可以把k去掉,但是一旦在j的時候不滿足這個等式,那麼維護時斜率本來就是遞增的,這意味著後面的點j'和k的斜率只會越來越大,更加滿足不了要求,還是k是最優的。這意味著k比它前面的要優,比它後面的點也要優。顧就是答案。

#include#include#include#include#define n 500009

using namespace std;

int sum[n],stk[n],dp[n];

int head,tail,m;

int getdp(int i,int j)

int getup(int j,int i)

int getdown(int j,int i)

int main()

head=tail=0;

stk[tail++]=0;

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

printf("%d\n",dp[n]);

} return 0;

}

hdu3507斜率優化dp

這題 n可能取500000,o n 2 就會超時吧,所有只能優化。注意到這題的動態規劃方程 dp i max dp j sum i sum j 2 m 化簡下得 dp i max dp j sum i 2 sum j 2 2 sum i sum j 無法直接用單調佇列優化,i和j不能分開。假設j比k...

HDU3507 斜率優化

r 題意 把n分成任意段 每段中連續 每一段代價 ci m 求總的最小代價 i l作為提醒自己的經驗題,即使再水也要記住坑點 其實是自己被坑的地方 斜率優化裸題 首先定義dp i 表示把前i個處理好的最小代價 dp i min 一看這個轉移就是n 2的,我們來搞成o n 的。h i m sum i ...

hdu 3507 斜率優化

我的第一道斜率優化。就這道題而言,寫出原始的方程 dp i min o n 2 的複雜度肯定超時,要麼優化轉移,要麼重寫方程。斜率優化的思想就是減少不必要的列舉 即不列舉肯定不會成為決策點的j 我們考慮兩個位置p 選擇q比選擇p優 當且僅當 dp q sum i sum q 2 m dp p sum...