#dDDLDPybttg050503. 1599:【 例 3】修剪草坪
1599:【 例 3】修剪草坪
好的,我将这道题整理为清晰的题面格式,并补充样例解释、数据范围与时空限制:
题目描述
原题来自:USACO 2011 Open Gold
在一年前赢得了小镇的最佳草坪比赛后,FJ 变得很懒,再也没有修剪过草坪。现在,新一轮的最佳草坪比赛又开始了,FJ 希望能够再次夺冠。
然而,FJ 的草坪非常脏乱,因此,FJ 只能够让他的奶牛来完成这项工作。FJ 有 只排成一排的奶牛,编号为 到 。每只奶牛的效率是不同的,奶牛 的效率为 。
靠近的奶牛们很熟悉,如果 FJ 安排超过 只连续的奶牛,那么这些奶牛就会罢工去开派对。因此,现在 FJ 需要你的帮助,计算 FJ 可以得到的最大效率,并且该方案中没有连续的超过 只奶牛。
输入格式
第一行:空格隔开的两个整数 和 ;
第二行到第 行:第 行有一个整数 ,表示奶牛 的效率。
输出格式
一行一个整数,表示 FJ 可以得到的最大的效率值。
样例
样例输入
5 2
1
2
3
4
5
样例输出
12
样例说明
,奶牛效率为 。
不能选择超过 只连续的奶牛。
一种最优方案:选择奶牛 1,2,4,5,效率为 。
注意不能选择连续的 3 只奶牛(例如 1,2,3 不行)。
数据范围
对于全部数据:
时空限制
- 时间:
- 内存:
提示
此题为 单调队列优化 DP 问题。
状态设计:
设 表示前 只奶牛,且第 只奶牛不选时的最大效率。
则转移方程为:
$$dp[i] = \max_{j=i-k-1}^{i-1} \{ dp[j] + \text{sum}_{j+1}^{i-1} \}$$其中 表示从 到 的奶牛效率之和(即连续选这些奶牛)。
解释:
第 只奶牛不选,那么我们可以选择从 到 连续一段奶牛,但这段长度不能超过 ,即 ,即 ,所以 。
优化:
设 (前缀和),则 。
代入得:
$$dp[i] = \max_{j \in [i-K-1, i-1]} \{ dp[j] + S_{i-1} - S_j \} = S_{i-1} + \max_{j \in [i-K-1, i-1]} \{ dp[j] - S_j \}$$其中 可以取 (表示前面全不选),。
因此,我们可以用 单调队列 维护区间 内 的最大值。
最终答案:
由于我们定义 为第 只不选,那么最终答案可以是 (第 只虚拟奶牛不选,相当于前 只可以任意选且连续不超过 只),或者可以直接计算 (即 不选,后面 到 可以连续选但长度有限制),更简便的方法是直接计算 。
步骤:
- 计算前缀和 ;
- 初始化单调队列,将 入队();
- 遍历 从 到 :
- 如果队首下标 ,则弹出队首;
- 计算 $dp[i] = S[i-1] + (dp[q_{\text{front}}] - S[q_{\text{front}}])$(注意 是前缀和下标);
- 从队尾弹出所有 $dp[q_{\text{back}}] - S[q_{\text{back}}] \le dp[i] - S[i]$ 的下标(维护单调递减队列,队首是最大值);
- 将 入队。
- 最终 即为答案。
复杂度:。