#dDDLDPybttg050506. 1602:烽火传递

1602:烽火传递

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


题目描述

原题来自:NOIP 2010 提高组初赛 · 完善程序

烽火台是重要的军事防御设施,一般建在交通要道或险要处。一旦有军情发生,则白天用浓烟,晚上有火光传递军情。

在某两个城市之间有 nn 座烽火台,每个烽火台发出信号都有一定的代价。为了使情报准确传递,在连续 mm 个烽火台中至少要有一个发出信号。现在输入 n,mn, m 和每个烽火台的代价,请计算总共最少的代价在两城市之间来准确传递情报。


输入格式

第一行两个整数 n,mn, m,表示 nn 个烽火台和连续烽火台数 mm

第二行 nn 个整数 aia_i,表示每个烽火台的代价。


输出格式

输出一行一个整数,表示最小总代价。


样例

样例输入

5 3
1 2 5 6 2

样例输出

4

样例说明

n=5,m=3n=5, m=3,烽火台代价 [1,2,5,6,2][1,2,5,6,2]

要求:任意连续 33 个烽火台中至少有一个发出信号。

一种最优方案:在第 22 号和第 55 号烽火台发信号,代价 2+2=42+2=4

检查连续 33 个:

  • 1~3:2号发信号,满足;
  • 2~4:2号发信号,满足;
  • 3~5:5号发信号,满足。

数据范围

对于全部数据:

  • 1n,m2×1051 \le n, m \le 2\times 10^5
  • 1ai10001 \le a_i \le 1000

时空限制

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

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

状态设计
dp[i]dp[i] 表示前 ii 个烽火台,且ii 个烽火台必须发出信号的最小总代价。

则转移方程为:

dp[i]=ai+minj=imi1dp[j]dp[i] = a_i + \min_{j=i-m}^{i-1} dp[j]

解释:如果第 ii 个烽火台发出信号,那么前一个发出信号的烽火台可以在 [im,i1][i-m, i-1] 之间(因为连续 mm 个烽火台至少有一个信号,所以 ii 和前一个信号之间最多间隔 m1m-1 个不发的烽火台,因此 jimj \ge i-m)。

初始条件:
我们可以添加一个虚拟的烽火台 00,代价 00,且 dp[0]=0dp[0]=0
那么对于 i=1i=1dp[1]=a1+dp[0]=a1dp[1] = a_1 + dp[0] = a_1

最终答案
因为最后一段连续 mm 个烽火台也必须至少有一个信号,所以答案应该是 minj=nm+1ndp[j]\min_{j=n-m+1}^{n} dp[j](即最后一段的某个烽火台必须发信号)。

优化
转移中的 minj=imi1dp[j]\min_{j=i-m}^{i-1} dp[j] 可以用 单调队列 维护窗口最小值。

步骤

  1. 初始化单调队列,将 j=0j=0dp[0]=0dp[0]=0)入队;
  2. 遍历 ii11nn
    • 如果队首下标 qfront<imq_{\text{front}} < i-m,则弹出队首;
    • 计算 dp[i]=ai+dp[qfront]dp[i] = a_i + dp[q_{\text{front}}]
    • 从队尾弹出所有 dp[qback]dp[i]dp[q_{\text{back}}] \ge dp[i] 的下标(维护单调递增队列,队首是最小值);
    • ii 入队;
  3. 最后取 dp[nm+1]dp[n-m+1]dp[n]dp[n] 的最小值作为答案。

复杂度:O(n)O(n)

注意:当 m=1m=1 时,每个烽火台都必须发信号,总代价为所有 aia_i 之和。