首先易证分割的顺序对答案没有影响((a+b)c+ab=a(b+c)+bc)。
然后设 Fi,k 表示前 i 个数分割了 k 次的得分。
有转移 Fi,k=max0≤j<i(Fj,k−1+sumj(sumi−sumj)),其中 sumi=i∑j=1ai。
把第二维滚动,设 fi=Fi,k,gi=Fi,k−1,式子变为 fi=max0≤j<i(gj+sumj(sumi−sumj))。
对于 0≤k<j<i,设 j 优于 k,有 gj+sumj(sumi−sumj)≥gk+sumk(sumi−sumk)gj+sumjsumi−sum2j≥gk+sumksumi−sum2k(gj−sum2j)−(gk−sum2k)≥(sumk−sumj)sumi(gj−sum2j)−(gk−sum2k)sumk−sumj≤sumi
注意特判 sumj=sumk 的情况,这时斜率为 −∞。
维护一只下凸包即可。
输出方案的话,中途记录一下选择的决策。
然鹅 BZOJ 不需要输出方案……
代码:
1 |
|