Bootstrap

HDU3507打印文章 斜率优化入门

打印文章

一、题意及数据范围

题目描述
题目大意:输出N个数字a[N],输出的时候可以连续的输出,每连续输出一串,它的费用是 “这串数字和的平方加上一个常数M”,求最小的费用。
数据范围
n<=500000 , m<=1000。

二、解法

基本思路

根据题目,我们可以列出dp[i]=dp[j]+(a[i]-a[j])2+m,其中dp[i]表示i点是最后一段的最后一个数字的最小花费,a[j]是前缀和。但是这个dp式显然是O(n2)的,我们考虑怎么对它进行优化,化简得:
dp[i]=dp[j]+a[i]2+a[j]2-2*a[i]*a[j]+m
由于这个dp式在计算时需要a[i]和a[j]的乘积,单调队列就不能维护了。

斜率优化
半年多没接触,都不知道怎么用它了……
接下来有一些玄学推导:
设用j更新比k更优,则:
dp[j]+a[i]2+a[j]2-2*a[i]*a[j]+m<dp[k]+a[i]2+a[k]2-2*a[i]*a[k]
消去同类项:dp[j]+a[j]2-2*a[i]*a[j]<dp[k]+a[k]2-2*a[i]*a[k]
移项:dp[j]-dp[k]+a[j]2-a[k]2<2*a[i]*(a[j]-a[k])
我们设f[j]=dp[j]+a[j]2,f[k]=dp[k]+a[k]2
d p [ j ] − a [ k ] a [ j ] − a [ k ] \frac{dp[j]-a[k]}{a[j]-a[k]} a[j]a[k]dp[j]

;