Learning to Paint

若无特殊说明,下标默认从 开始标号。


优先队列优化太好玩了!

建议先完成:P1631 UVA11997


容易设计线性 DP 状态: 表示考虑仅前 个数时,所有方案权值从大到小排序的数组。对于初始状态 ,仅有填涂 (权值为 )与什么都不画(权值为 )两种情况。对于 ,情况可分为几种:

  • 不填涂第 格:
  • 填涂了 ):此时其他的格子都没法填充。
  • 填涂了 ):此时第 格无法填涂,需要从 开始转移。,其中 在这里表示拼接两个数组。

将上述三种情况合并起来: ,其中 定义同上, 表示将参数中的数组排序返回。实现中,题目仅求前 大,因此每个状态仅需保留前 项即可。

这样进行动态规划,求 的时间复杂度为 。总复杂度为


我们还可以继续优化求 的速度。我们保证了 为降序有序数组,因此 的最大值应该只可能从 转移而来。选择了某个元素,就将其删除,让次大值成为最大。实践中不需要真正地删除,记录下当前的首元素是第几个就可以。整个过程使用优先队列维护,每次从队列中取出最大值,若其不是最后一项就将下一项入队。

受不了了。写的太抽象了,还是看 代码 吧!

posted @ 2024-05-19 18:59  MrPython  阅读(7)  评论(0)    收藏  举报  来源