hdu 4258 斜率優化DP

2021-06-08 22:03:06 字數 880 閱讀 4225

題目大意:將n個公升序數字序列,分成幾組連續的序列 ,每一組的所得值,等於最右邊的num2減去最左邊 的num1,的平方+c即(numi-numj)^2+c

解題報告 人:ghq(springwater)

分析可得:(dp[j2]-dp[j1]+num[j2+1]*num[j2+1]-num[j1+1]*num[j1+1])/(2(num[j2+1]-num[j1+1]))《=num[i]時,j2比j1更優,可知這是乙個凹曲線斜率優化;

i=k(j,k)時,那麼j是可以去掉的。

1.當 k(j,k)《=num[i]時,j沒 k優,可去 j

2.當 k(j,k)>=num[i]時,則k(i,j)》=num[i],i比j優秀,可去j!

自己默思:1,:為什麼當前佇列左邊相鄰的k(l,l+1) 第乙個滿足》num[i]時,即l比l+1優,則l比右邊的所有 都優,因為l和右邊的組合斜率是增加的,l+1同樣優於l+2,

由傳遞性可得,第一次l為最優,

2:為什麼當前i總用和相鄰的(r-1,r)和(r,i)比較即可確定是否刪除r,因為當k(r,i)>=k(r,r-1)則k(r,i)大於在佇列裡所有任意 組合 的 斜率!能確保 k(r,i)是最大的 斜率。

也就 保證了,斜率遞增!

當》=num[i]時為凸曲線斜率優化!

hdu4258

#include#define maxn 1000005

int que[10000];

__int64 num[maxn],dp[maxn];

double k(int j1,int j2)

int main()

printf("%i64d\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...

HDU 3480 DP 斜率優化

題意 給你n個數字,然後叫你從這些數字中選出m堆,使得每一堆的總和最小,一堆的總和就是這一堆中最大值減去最小值的平方,最後要使得所有堆加起來的總和最小。思路 對這些數字排序之後,很容易想到dp解法,用dp i j 表示數字i現在在第j堆,那麼轉移方程就是dp i j min dp i j dp k ...

斜率優化 DP

我們知道,有些dp方程可以轉化成dp i f j x i 的形式,其中f j 中儲存了只與j相關的量。這樣的dp方程我們可以用單調佇列進行優化,從而使得o n 2 的複雜度降到o n 可是並不是所有的方程都可以轉化成上面的形式,舉個例子 dp i dp j x i x j x i x j 如果把右邊...