#dDDLDPybttg050506. 1602:烽火传递
1602:烽火传递
好的,我将这道题整理为清晰的题面格式,并补充样例解释、数据范围与时空限制:
题目描述
原题来自:NOIP 2010 提高组初赛 · 完善程序
烽火台是重要的军事防御设施,一般建在交通要道或险要处。一旦有军情发生,则白天用浓烟,晚上有火光传递军情。
在某两个城市之间有 座烽火台,每个烽火台发出信号都有一定的代价。为了使情报准确传递,在连续 个烽火台中至少要有一个发出信号。现在输入 和每个烽火台的代价,请计算总共最少的代价在两城市之间来准确传递情报。
输入格式
第一行两个整数 ,表示 个烽火台和连续烽火台数 ;
第二行 个整数 ,表示每个烽火台的代价。
输出格式
输出一行一个整数,表示最小总代价。
样例
样例输入
5 3
1 2 5 6 2
样例输出
4
样例说明
,烽火台代价 。
要求:任意连续 个烽火台中至少有一个发出信号。
一种最优方案:在第 号和第 号烽火台发信号,代价 。
检查连续 个:
- 1~3:2号发信号,满足;
- 2~4:2号发信号,满足;
- 3~5:5号发信号,满足。
数据范围
对于全部数据:
时空限制
- 时间:
- 内存:
提示
此题为 单调队列优化 DP 问题。
状态设计:
设 表示前 个烽火台,且第 个烽火台必须发出信号的最小总代价。
则转移方程为:
解释:如果第 个烽火台发出信号,那么前一个发出信号的烽火台可以在 之间(因为连续 个烽火台至少有一个信号,所以 和前一个信号之间最多间隔 个不发的烽火台,因此 )。
初始条件:
我们可以添加一个虚拟的烽火台 ,代价 ,且 。
那么对于 ,。
最终答案:
因为最后一段连续 个烽火台也必须至少有一个信号,所以答案应该是 (即最后一段的某个烽火台必须发信号)。
优化:
转移中的 可以用 单调队列 维护窗口最小值。
步骤:
- 初始化单调队列,将 ()入队;
- 遍历 从 到 :
- 如果队首下标 ,则弹出队首;
- 计算 ;
- 从队尾弹出所有 的下标(维护单调递增队列,队首是最小值);
- 将 入队;
- 最后取 到 的最小值作为答案。
复杂度:。
注意:当 时,每个烽火台都必须发信号,总代价为所有 之和。