#dDDLDPybttg050503. 1599:【 例 3】修剪草坪

1599:【 例 3】修剪草坪

好的,我将这道题整理为清晰的题面格式,并补充样例解释、数据范围与时空限制:


题目描述

原题来自:USACO 2011 Open Gold

在一年前赢得了小镇的最佳草坪比赛后,FJ 变得很懒,再也没有修剪过草坪。现在,新一轮的最佳草坪比赛又开始了,FJ 希望能够再次夺冠。

然而,FJ 的草坪非常脏乱,因此,FJ 只能够让他的奶牛来完成这项工作。FJ 有 NN 只排成一排的奶牛,编号为 11NN。每只奶牛的效率是不同的,奶牛 ii 的效率为 EiE_i

靠近的奶牛们很熟悉,如果 FJ 安排超过 KK 只连续的奶牛,那么这些奶牛就会罢工去开派对。因此,现在 FJ 需要你的帮助,计算 FJ 可以得到的最大效率,并且该方案中没有连续的超过 KK 只奶牛。


输入格式

第一行:空格隔开的两个整数 NNKK

第二行到第 N+1N+1 行:第 i+1i+1 行有一个整数 EiE_i,表示奶牛 ii 的效率。


输出格式

一行一个整数,表示 FJ 可以得到的最大的效率值。


样例

样例输入

5 2
1
2
3
4
5

样例输出

12

样例说明

N=5,K=2N=5, K=2,奶牛效率为 [1,2,3,4,5][1,2,3,4,5]

不能选择超过 22 只连续的奶牛。
一种最优方案:选择奶牛 1,2,4,5,效率为 1+2+4+5=121+2+4+5=12
注意不能选择连续的 3 只奶牛(例如 1,2,3 不行)。


数据范围

对于全部数据:

  • 1N1051 \le N \le 10^5
  • 0Ei1090 \le E_i \le 10^9

时空限制

  • 时间:1000 ms1000 \text{ ms}
  • 内存:524288 KB524288 \text{ KB}

提示
此题为 单调队列优化 DP 问题。

状态设计
dp[i]dp[i] 表示前 ii 只奶牛,且第 ii 只奶牛不选时的最大效率。

则转移方程为:

$$dp[i] = \max_{j=i-k-1}^{i-1} \{ dp[j] + \text{sum}_{j+1}^{i-1} \}$$

其中 sumj+1i1\text{sum}_{j+1}^{i-1} 表示从 j+1j+1i1i-1 的奶牛效率之和(即连续选这些奶牛)。

解释
ii 只奶牛不选,那么我们可以选择从 j+1j+1i1i-1 连续一段奶牛,但这段长度不能超过 KK,即 i1(j+1)+1Ki-1 - (j+1) + 1 \le K,即 ij1Ki-j-1 \le K,所以 jiK1j \ge i-K-1

优化
Si=E1+E2++EiS_i = E_1 + E_2 + \dots + E_i(前缀和),则 sumj+1i1=Si1Sj\text{sum}_{j+1}^{i-1} = S_{i-1} - S_j

代入得:

$$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 \}$$

其中 jj 可以取 00(表示前面全不选),dp[0]=0,S0=0dp[0]=0, S_0=0

因此,我们可以用 单调队列 维护区间 [iK1,i1][i-K-1, i-1]dp[j]Sjdp[j] - S_j 的最大值。

最终答案
由于我们定义 dp[i]dp[i] 为第 ii 只不选,那么最终答案可以是 dp[N+1]dp[N+1](第 N+1N+1 只虚拟奶牛不选,相当于前 NN 只可以任意选且连续不超过 KK 只),或者可以直接计算 max{dp[i]+SNSi}\max\{ dp[i] + S_N - S_i \}(即 ii 不选,后面 i+1i+1NN 可以连续选但长度有限制),更简便的方法是直接计算 dp[N+1]dp[N+1]

步骤

  1. 计算前缀和 SS
  2. 初始化单调队列,将 j=0j=0 入队(dp[0]S[0]=0dp[0]-S[0]=0);
  3. 遍历 ii11N+1N+1
    • 如果队首下标 qfront<iK1q_{\text{front}} < i-K-1,则弹出队首;
    • 计算 $dp[i] = S[i-1] + (dp[q_{\text{front}}] - S[q_{\text{front}}])$(注意 i1i-1 是前缀和下标);
    • 从队尾弹出所有 $dp[q_{\text{back}}] - S[q_{\text{back}}] \le dp[i] - S[i]$ 的下标(维护单调递减队列,队首是最大值);
    • ii 入队。
  4. 最终 dp[N+1]dp[N+1] 即为答案。

复杂度:O(N)O(N)