1 条题解
-
0
题解
思路
从左到右处理数组。处理完位置 后,把 所在的颜色称为“当前颜色”,另一种颜色称为“另一颜色”。红、蓝本身完全对称,因此不必记录具体颜色,只需记录另一颜色最后一个数的值 。
设状态值 表示处理完当前位置、另一颜色最后一个数为 时的最大得分。用 表示另一颜色尚未出现;由于所有 都是正数,这个哨兵不会与合法值混淆。
转移
设上一个数为 ,当前读到 。
如果继续使用当前颜色,所有状态都保留 ;仅当 时统一增加 。
如果切换颜色,切换前另一颜色的最后一个值若等于 ,当前数贡献 ,否则贡献 。切换后,新的“另一颜色”最后一个值变为 。因此切换所得的最好值为
它只会更新下标 对应的状态。
做法
每一步只需要四种操作:全体状态加同一个数、查询全局最大值、查询一个值、对一个值取最大。令实际状态为 ,其中 保存全局增量,再单独维护所有 的最大值即可在常数时间完成一次转移。
值域不超过 ,可用数组和时间戳记录被访问过的 ,避免每组数据清空整个值域。初始时只有 ,最终答案是全局最大的 。
正确性证明
对处理位置数作归纳。初始只处理 时,两种颜色等价,另一颜色为空,状态 完整描述所有方案。
假设处理完 后,每个 都等于其定义下所有染色方案的最优得分。位置 只有两种选择:保持与 相同的颜色,或切换到另一颜色。保持颜色时,另一颜色末值不变,贡献恰由 决定;切换颜色时,原另一颜色末值决定贡献,且切换后的另一颜色末值恰为 。转移分别枚举并取这两类方案的最大值,没有遗漏,也不会加入不合法方案。因此归纳成立,最终全局最大状态就是所有染色方案的最大得分。
复杂度
每个位置只进行常数次操作。单组数据时间复杂度为 ,额外空间复杂度为 ,其中 。
信息
- ID
- 1042
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 0
- 上传者