Learning to Paint
若无特殊说明,下标默认从 开始标号。
优先队列优化太好玩了!
容易设计线性 DP 状态: 表示考虑仅前 个数时,所有方案权值从大到小排序的数组。对于初始状态 ,仅有填涂 (权值为 )与什么都不画(权值为 )两种情况。对于 ,情况可分为几种:
- 不填涂第 格:。
- 填涂了 ():此时其他的格子都没法填充。。
- 填涂了 ():此时第 格无法填涂,需要从 开始转移。,其中 在这里表示拼接两个数组。
将上述三种情况合并起来: ,其中 定义同上, 表示将参数中的数组排序返回。实现中,题目仅求前 大,因此每个状态仅需保留前 项即可。
这样进行动态规划,求 的时间复杂度为 。总复杂度为 。
我们还可以继续优化求 的速度。我们保证了 为降序有序数组,因此 的最大值应该只可能从 转移而来。选择了某个元素,就将其删除,让次大值成为最大。实践中不需要真正地删除,记录下当前的首元素是第几个就可以。整个过程使用优先队列维护,每次从队列中取出最大值,若其不是最后一项就将下一项入队。
受不了了。写的太抽象了,还是看 代码 吧!