題目大意:將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 如果把右邊...