【BZOJ4518】征途——DP 斜率优化

坑++,待填。。。

题目大意:

给你一个长为n的序列,要求将这个序列分成m段,使得每段内数字之和构成的方差最小.输出这个最小方差与\(m^2\)的乘积

题解:

Step 1:最开始的状态转移方程

我们设\(f[i][j]\)表示前\(i\)段路用\(j\)天走完所得的最小答案

那么可以得到状态转移方程:\[f[i][j]=min\left\{f[i-1][k]+(s[i]-s[k]-avg)^2\right\}\]

其中\(1\leq k<j\),表示上一天走到第几段路;\(avg\)为每段路程的平均值;数组\(s\)是前缀和

Step 2:滚动数组优化

又可以发现,所有的\(f[i]\)只与\(f[i-1]\)相关

所以就想到用滚动数组优化

设数组\(g\)等于原来的\(f[i-1]\),数组\(f\)等于原来的\(f[i]\),那么原来的状态转移方程就变为了:\[f[j]=min\left\{g[k]+(s[i]-s[k]-avg)^2\right\}\]

Step 3:斜率优化

在dp题里看到平方,很自然就想到了斜率优化

对于\(f[j]\),如果上面式子中的\(k\)\(x\)优于取\(y\),那么:\[g[x]+(s[i]-s[x]-avg)^2<g[y]+(s[i]-s[y]-avg)^2\]

把括号拆开:\[g[x]+s[i]^2+s[x]^2+avg^2-2*s[i]*s[x]-2*s[i]*avg-2*s[x]*avg<g[y]+s[i]^2+s[y]^2+avg^2-2*s[i]*s[y]-2*s[i]*avg-2*s[y]*avg\]

消掉两边一样的项:\[g[x]+s[x]^2-2*s[i]*s[x]-2*s[x]*avg<g[y]+s[y]^2-2*s[i]*s[y]-2*s[y]*avg\]

移项:\[g[x]+s[x]^2-2*s[x]*avg-(g[y]+s[y]^2-2*s[y]*avg)<2*s[i]*s[x]-2*s[i]*s[y]\]

猜你喜欢

转载自www.cnblogs.com/Sleepy-Piggy/p/9066794.html