P7962 [NOIP2021] 方差
不难得到以下结论:( \(d_1\) 不能交换所以特殊考虑 )
- 操作实质为交换差分数组
- 最终差分数组形成单峰(中间低)
并且答案为:
\[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,可以考虑从两端填数,通过记录前缀的信息推断后缀的信息;也可从中间填数,直接维护当前的信息。