不难得到以下结论:( d1 不能交换所以特殊考虑 )
- 操作实质为交换差分数组
- 最终差分数组形成单峰(中间低)
并且答案为:
n∑x2i−(∑x)2
考虑一个 dp: fi,x,s: 前 i 个 d ,当前前缀 x 的值,前后缀 ∑x 的值,此时 ∑x2 的最小值。
将 d 降序排列,转移枚举当前 d 放在开头还是末尾,可得:
fi,x,s=min(fi−1,x−di,s−x+x2,fi−1,x,s−(an−(predi−1−x))+(an−(predi−1−x))2)
最后求 nfn,x,s−s2 的最小值即可,时间复杂度 O(n2A2)。
考虑优化状态数,问题在于 x 这一维
此时换一种加入方式,从单峰的中间部分开始填数,通过增量维护平方和
fi,s=min(fi−1,s−dii+2sdi+idi2,fi−1,s−predi+predi2)
这样做的时间复杂度为 O(n2A)
注意到当 n>A 时 , d≠0 的个数至多有 A 个。
那么只需计算这 A 个非 0 值即可,时间复杂度 O(min(n,A)nA)
总结
对于单峰序列的 dp,可以考虑从两端填数,通过记录前缀的信息推断后缀的信息;也可从中间填数,直接维护当前的信息。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现