题目链接:P10977 Cut the Sequence - 洛谷。
本题是经典 DP 单调队列优化题型。
题目描述
给定一个长度为 的整数序列 ,你需要将这个序列划分成若干部分,满足每一部分都是原序列的一个连续子序列,且每个部分的整数之和均不超过 。你的任务是求出在所有合法的划分方式中,每一部分的最大值之和的最小值。
输入格式
输入的第一行包含两个整数 和 (,)。第二行包含 个整数,依次为 ()。
输出格式
输出一个整数,表示每一部分的最大值之和的最小值。如果不存在合法的划分方式,输出 。
输入输出样例 #1
输入 #1
输出 #1
说明/提示
样例解释:
将序列划分为三个部分:,此时每一部分的最大值之和为 。可以证明,不存在更优的方案。
题解
状态定义和转移
令 表示前 个元素合法划分的最大值之和的最小值。很容易得到状态转移方程:
即使我们使用 的复杂度来预处理 的最大值,整个状态转移空间仍然是 级别。
单调队列优化
很容易发现, 是单调不减的。这意味着,如果 ,则
因此,在队列中后加入的 一定不会是一个比 更优的决策。我们可以用单调队列来维护这一决策单调性。