1. 问题描述:

烽火台是重要的军事防御设施,一般建在交通要道或险要处。一旦有军情发生,则白天用浓烟,晚上有火光传递军情。在某两个城市之间有 n 座烽火台,每个烽火台发出信号都有一定的代价。为了使情报准确传递,在连续 m 个烽火台中至少要有一个发出信号。现在输入 n,m 和每个烽火台的代价,请计算在两城市之间准确传递情报所需花费的总代价最少为多少。

输入格式

第一行是两个整数 n,m,具体含义见题目描述;第二行 n 个整数表示每个烽火台的代价 ai。

输出格式

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

数据范围

1 ≤ n,m ≤ 2 × 10 ^ 5,

0 ≤ ai ≤ 1000

输入样例:

5 3
1 2 5 6 2

输出样例:

4
来源:https://www.acwing.com/problem/content/description/1091/

2. 思路分析:

分析题目可以知道这是一个最优化问题,所以我们考虑使用动态规划的思想来解决。根据题目的描述我们可以知道我们声明一个一维数组f,其中f[i]表示点燃第i个烽火台的最小花费;怎么样进行状态计算呢?状态计算一般是找最后一个不同点,我们可以枚举倒数第二个位置的最小花费,可以发现倒数第二个位置的烽火台的位置可以是i - m,i - m + 1....i - 1,所以枚举这些位置的最小花费累加到当前位置即可,而这是一个区间的最小值问题,所以可以使用单调队列进行优化,在队列中维护长度不超过m的最小花费对应的位置即可,经过优化之后那么就不用使用额外的循环来枚举整个连续的区间求解最小值了。

3. 代码如下:

if __name__ == '__main__':n, m = map(int, input().split())w = [0] + list(map(int, input().split()))q = [0] * (n + 1)# hh为队头指针, tt为队尾指针, tt = -1时表示为空, 0时表示有一个元素hh, tt = 0, 0# f[0]其实也是一种方案,一开始的队头元素是0f = [0] * (n + 1)for i in range(1, n + 1):# 一般边界问题可以通过画图确定if q[hh] < i - m: hh += 1f[i] = f[q[hh]] + w[i]while hh <= tt and f[q[tt]] >= f[i]: tt -= 1tt += 1q[tt] = ires = 10 ** 9# m个连续的烽火台其实是m + 1个烽火台所以在枚举的时候为n - m + 1for i in range(n - m + 1, n + 1):res = min(res, f[i])print(res)

1089 烽火传递(单调队列优化)相关推荐

  1. [NOIP2010初赛]烽火传递--单调队列优化

    问题描述: 烽火台又称烽燧,是重要的军事防御设施,一般建在险要或交通要道上.一旦有敌情发生,白天燃烧柴草,通过浓烟表达信息:夜晚燃烧干柴,以火光传递军情,在某两座城市之间有n个烽火台,每个烽火台发出信 ...

  2. AcWing1089.烽火传递(单调队列DP)

    题目传送门 烽火台是重要的军事防御设施,一般建在交通要道或险要处. 一旦有军情发生,则白天用浓烟,晚上有火光传递军情. 在某两个城市之间有 n 座烽火台,每个烽火台发出信号都有一定的代价. 为了使情报 ...

  3. AcWing 1089 烽火传递 题解(动态规划—DP—单调队列优化DP)

    AcWing 1089 烽火传递 单调队列优化DP,思路比较简单,维护一个保持元素单调递增的单调队列,队首就是第i座烽火台能接收到的,代价最小的方案,加上第i座烽火台的代价就是这座烽火台的最小值 #i ...

  4. 2018.09.06 烽火传递(单调队列优化dp)

    描述 烽火台是重要的军事防御设施,一般建在交通要道或险要处.一旦有军情发生,则白天用浓烟,晚上有火光传递军情. 在某两个城市之间有 n 座烽火台,每个烽火台发出信号都有一定的代价.为了使情报准确传递, ...

  5. 【单调队列优化DP】烽火传递 LibreOJ - 10180

    题目来源 点我进入提交题目 反思 因为目前在学习单调队列优化DP,所以会往单调队列上面想.然后犯了一个错误就是,认为这个题目只要用单调队列就可以完成,单调队列只是用来减少时间复杂度的,遇到了求最优解的 ...

  6. Acwing -- 单调队列优化的DP问题

    文章目录 引入 acwing154 滑动窗口 应用 135 最大子序和 1088.旅行问题 AcWing 1087. 修剪草坪28 AcWing 1089. 烽火传递 AcWing 1090. 绿色通 ...

  7. 单调队列优化的DP问题

    概述 单调队列就是通过排除求最值时候的冗余,从而是队列具有性质,可以方便求解问题. DP的两个阶段: 朴素DP的基本原理--闫氏DP分析法 对朴素DP进行优化 闫氏DP分析法的拓展 :在一个有限的集合 ...

  8. Acwing 1089. 烽火传递

    Acwing 1089. 烽火传递 题意: 有n个数,要保证每m个数中必须选一个,问所选数的最小总和是多少 题解: 我一开始设的状态为:dp[i]表示前i个数选完的最小值,第i个数可以选也可以不选,但 ...

  9. 提高篇 第五部分 动态规划 第5章 单调队列优化动态规划

    单调队列:是一种双端除列,其内部元素具有单调性. 最大队列 最小队列 操作: .插入:新元素插入队尾,删除除尾元素,直到找到插入后不会破坏单调性的为止. .获取最大(最小)值,访问队首元素. 单调队列 ...

  10. 算法笔记--单调队列优化dp

    单调队列:队列中元素单调递增或递减,可以用双端队列实现(deque),队列的前面和后面都可以入队出队. 单调队列优化dp: 问题引入: dp[i] = min( a[j] ) ,i-m < j ...

最新文章

  1. 24点——判断4个数能否经过运算使得结果为24
  2. Java实现读取pdf文件内容(how to read pdf in java)
  3. 原生JS上传图片接收服务器端图片并且显示图片(主要描述blob类型)
  4. 决胜秋招!分享128 道 Python 精选面试题!
  5. [转]Using Angular in Visual Studio Code
  6. Java基本数据类型及其包装类
  7. OpenCV之颜色空间转换(笔记10)
  8. php 怎么输出alert,php简单提示框alert封装函数
  9. 二分搜索:lower_bound 与 upper_bound 函数
  10. Android APK系列3-------使用platform密钥来给apk文件签名
  11. 2020语言与智能技术竞赛-事件抽取方案整理(第一波
  12. nginx配置http访问自动跳转到https
  13. Matlab函数——randn
  14. 微信内置浏览器不支持下载文件的解决方案
  15. jmeter TCP接口压力测试
  16. 高斯消元解线性方程组
  17. 手机点击出现蓝色区域方块
  18. 3d渲染是显示计算机内存不足,win10系统使用3d渲染图片出现内存不足如何解决
  19. linux关闭cups服务 关闭631端口 关闭avahi-daemon服务
  20. 孙鑫VC++深入详解笔记

热门文章

  1. crm系统客户池功能流程泳道图
  2. 华为光猫HG8240的简单配置过程
  3. C语言:输入英文句子,将所有单词首字符转换成大写后输出
  4. ArcGIS教程:什么是ArcGIS中的报表
  5. C11 标准特性研究
  6. VENUE | S6L初次安装详细视频指南
  7. [Android Pro] 将你的安卓手机屏幕共享到PC或Mac上
  8. java毕业设计苹果酒店住房管理源码+lw文档+mybatis+系统+mysql数据库+调试
  9. 关于《半反去雾算法》一文的四宗罪。
  10. 【灵修】人不迷失方向一定是心中有了目标(转)