题解 P6821 [PA2012] Tanie linie

发布时间 2023-09-18 11:04:12作者: reclusive2007

本来想写 wqs 二分来着,然后推不出 dp 方程,摆烂了。


题目描述

给定含 \(n\) 个数的序列,求至多 \(k\) 个不相交子段的和的最大值。

具体思路

由于选 \(k\) 堆连续的数,因此一堆连续的符号相同的数,只有可能是同时被选或者同时不被选。

因此我们先对原序列预处理一遍,将相同符号的合并到一起。

现在的序列就是一个正负交替的序列。

要答案最大,那我们肯定先把所有正数都选出来。

若正数个数小于等于 \(k\),那我们直接输出就好了,因为再选一些负数只会让我们的答案变得更小。

若正数个数大于 \(k\),此时我们有两种操作。

  • 操作 1:将选定的正数中删除一部分正数。

  • 操作 2:将两堆正数连同它们之间的负数合并成一堆,这样堆数就会减少一堆。