P7962 [NOIP2021] 方差

不难得到以下结论:( \(d_1\) 不能交换所以特殊考虑 )

  1. 操作实质为交换差分数组
  2. 最终差分数组形成单峰(中间低)

并且答案为:

\[n\sum x_i^2-(\sum x)^2 \]

考虑一个 dp: $f_{i,x,s}: $ 前 \(i\)\(d\) ,当前前缀 \(x\) 的值,前后缀 \(\sum x\) 的值,此时 \(\sum x^2\) 的最小值。

\(d\) 降序排列,转移枚举当前 \(d\) 放在开头还是末尾,可得:

\[f_{i,x,s}=\min(f_{i-1,x-d_i,s-x}+x^2,f_{i-1,x,s-(a_n-(pred_{i-1}-x))}+(a_n-(pred_{i-1}-x))^2) \]

最后求 \(nf_{n,x,s}-s^2\) 的最小值即可,时间复杂度 \(\mathcal O(n^2A^2)\)

考虑优化状态数,问题在于 \(x\) 这一维

此时换一种加入方式,从单峰的中间部分开始填数,通过增量维护平方和

\(f_{i,s}=\min(f_{i-1,s-d_ii}+2sd_i+i{d_i}^2,f_{i-1,s-pred_i}+{pred_i}^2)\)

这样做的时间复杂度为 \(\mathcal O(n^2A)\)

注意到当 \(n >A\) 时 , \(d \not= 0\) 的个数至多有 \(A\) 个。

那么只需计算这 \(A\) 个非 \(0\) 值即可,时间复杂度 \(\mathcal O(\min(n,A)nA)\)

总结

对于单峰序列的 dp,可以考虑从两端填数,通过记录前缀的信息推断后缀的信息;也可从中间填数,直接维护当前的信息。

posted @ 2023-01-31 21:48  chihik  阅读(28)  评论(0编辑  收藏  举报