1 条题解
-
0
题解
思路
如果最终选择了数值 ,那么同样等于 的元素之间不会互相删除,因此应把所有 都选完, 总贡献为 ,其中 是 的出现次数。另一方面,选择过 后,数值 与 都不能再产生贡献。
于是原问题等价于:在数轴上选择若干个互不相邻的数值 ,使 最大。这是带点权路径上的最大权独立集。
做法
令 表示只考虑数值 时的最大得分。对数值 有两种选择:
- 不选 ,得分为 ;
- 选 ,则不能选 ,得分为 。
因此
从小到大递推至最大输入值即可。答案可能达到 ,必须使用 64 位整数。
子任务说明
- 当 时,可以枚举选中的元素子集,拒绝其中存在数值相差 的方案并取最大和, 时间复杂度为 。
- 当任意两个不同输入值之差都不为 时,不同数值之间不会互相删除,选择全部元素就是最优, 直接求和即可。
- 一般情形使用上述频次 DP。
正确性证明
先证明同一数值 在最优方案中要么全选,要么全不选。选择一个 只会删除数值为 与 的元素,不会删除其他 ;因此一旦选择了 ,继续选择剩余的所有 只会增加得分而不会带来新的限制。
考虑递推到数值 的任意最优方案。若方案不选 ,其得分至多为 ,且该值可达。 若方案选择 ,根据相邻冲突必不选择 ;其余选择完全落在 到 中,最优贡献 为 ,再加上全部数值 的贡献 。两类方案覆盖所有可能性,取最大值得到 的恰是 。由归纳法,最终状态就是全局最优答案。
复杂度
设值域上界为 。时间复杂度为 ,空间复杂度为 。
- 1
信息
- ID
- 1091
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 0
- 上传者