我们可以把问题抽象一下:
把一个序列划分成若干段,如果某一段对应的区间为 [l,r],则代价为 cr+r∑i=lpi(xr−xi)。
于是得到转移方程 fi=min0≤j<i(fj+ci+i∑k=j+1pk(xi−xk))。
设 si=i∑j=1pi,Si=i∑j=1pixi。
则原式变为 fi=min0≤j<i(fj+ci+(si−sj)xi−(Si−Sj))。
对于 0≤k<j<i,设此时选择 j 更优,即 fj+ci+(si−sj)xi−(Si−Sj)≤fk+ci+(si−sk)xi−(Si−Sk)。
整理一下,有 fj+ci+(si−sj)xi−(Si−Sj)≤fk+ci+(si−sk)xi−(Si−Sk)fj−sjxi+Sj≤fk−skxi+Sk(fj+Sj)−(fk+Sk)≤(sj−sk)xi(fj+Sj)−(fk+Sk)sj−sk≤xi
单调队列维护下凸包即可。
代码:
1 |
|