1 条题解
-
0
题解
思路
先把相邻且同色的夹克压缩成一个连续段。记压缩后共有 段,第 段颜色为 、长度为 ,移动整段的代价为 。
最优方案中,打包时总会取走栈顶极长同色段;移动时也只需考虑移动完整连续段。若只移动某段的一部分,则两栈顶部会同时出现同色夹克,直接打包原栈顶不会更差。
定义 为只处理连续段 的最小代价。可以直接用 打包第 段,再处理 ;也可以把第 段与后面若干个同色段合并打包。被选同色段之间的区间都是独立子问题。
对固定的 ,只看满足 的位置。维护:
- :把从 到 选中的同色段按第一种移动方向合并时的最小代价;
- :按另一种移动方向合并时的最小代价。
初值为 、。若上一个选中位置是 ,则
选到 后,合并这些段并打成一包的代价为
与直接打包第 段的方案取最小即可。
做法
子任务 1 可把“左栈、右栈”的完整状态作为最短路节点,枚举两次移动和两次打包操作,用 Dijkstra 求空状态的最短距离。
若 ,移动一件夹克的代价已经不小于直接打包一个栈顶连续段,任何合并节省的打包次数都不足以抵消移动代价,因此答案就是压缩后连续段数乘 。
子任务 3 对每个区间 重新计算上述 ,复杂度为 。
满分算法按 从大到小预先计算所有同色位置间的 ,再枚举右端点更新 ,把重复计算消除到 。
复杂度
- 子任务 1 的状态数为指数级,适用于 。
- 子任务 2 的时间复杂度为 ,空间复杂度为 (不计输入)。
- 子任务 3 的时间复杂度为 ,空间复杂度为 。
- 满分算法的时间复杂度为 ,空间复杂度为 。
- 1
信息
- ID
- 1413
- 时间
- 2000ms
- 内存
- 512MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者