刷题总结——烽火传递(单调队列+dp)
题目:
题目描述
烽火台又称烽燧,是重要的防御设施,一般建在险要处或交通要道上。一旦有敌情发生,白天燃烧柴草,通过浓烟表达信息:夜晚燃烧干柴,以火光传递军情。在某两座城市之间有 n 个烽火台,每个烽火台发出信号都有一定的代价。为了使情报准确的传递,在 m 个烽火台中至少要有一个发出信号。现输入 n、m 和每个烽火台发出的信号的代价,请计算总共最少需要多少代价,才能使敌军来袭之时,情报能在这两座城市之间准确的传递!
输入格式
第一行有两个数 n,m 分别表示 n 个烽火台,在任意连续的 m 个烽火台中至少要有一个发出信号。
第二行为 n 个数,表示每一个烽火台的代价。
输出格式
一个整数,即最小代价。
样例数据 1
输入 [复制]
5 3
1 2 5 6 2
输出
4
备注
【数据范围】
1<=n,m<=1,000,000,保证答案在 int 范围内。
1<=n,m<=1,000,000,保证答案在 int 范围内。
题解:
引用ssoj官方题解:
要用动态规划的方法解决。
我们可以写出这样的方程f[i]:=min{f[j]}+a[i](i-m<=j<i-1)
因为要保证i之前的3个中必须存在被点亮的烽火台。单纯这样循环会造成超时。
我们想到了用单调队列进行优化,由于随着i的循环,每次只有一个i进入决策区间也只有一个i出决策区间,由于每次选取决策区间中的最小值,所以维护一个单调递增序列,每次取出队首元素即可。
为什么可以将队尾元素无情的删去呢?由于后进队的序列同时满足在原序列中的位置更靠后和其在动态规划中的价值更大。这样选取这个元素就要比选取之前的任何一个决策要优,所以之前被删掉的决策都是无用的。
这道题的本质就是用单调队列维护了决策本身的价值和其在原序列中位置的同时单调。
要特别注意单调队列中的值是决策在原决策序列中的位置。
第一次见dp可以用单调队列搞的····牛逼
代码:
#include<iostream> #include<cstdio> #include<cstdlib> #include<cmath> #include<ctime> #include<cctype> #include<cstring> #include<string> #include<algorithm> using namespace std; const int inf=1e+9; const int N=1e6+5; int n,m,w[N]; int que[N],head,tail,dp[N]; inline int R() { int f=0;char c;for(c=getchar();(c<'0'||c>'9');c=getchar());for(;c>='0'&&c<='9';c=getchar())f=(f<<3)+(f<<1)+c-'0';return f; } int main() {//freopen("a.in","r",stdin);n=R(),m=R();for(int i=1;i<=n;i++)w[i]=R();head=1,tail=1;dp[1]=w[1];que[1]=1;int temp=inf;for(int i=1;i<=m;i++)dp[i]=min(temp,w[i]);for(int i=2;i<=n;i++){if(i>m) dp[i]=dp[que[head]]+w[i];tail++; while(dp[i]<=dp[que[tail-1]]&&tail>head) tail--;que[tail]=i;if(que[tail]-que[head]>=m) head++;}int ans=inf;for(int i=n;i>=n-m+1&&i>=1;i--)ans=min(ans,dp[i]);cout<<ans<<endl;return 0; }
转载于:https://www.cnblogs.com/AseanA/p/7257328.html
刷题总结——烽火传递(单调队列+dp)相关推荐
- AcWing1089.烽火传递(单调队列DP)
题目传送门 烽火台是重要的军事防御设施,一般建在交通要道或险要处. 一旦有军情发生,则白天用浓烟,晚上有火光传递军情. 在某两个城市之间有 n 座烽火台,每个烽火台发出信号都有一定的代价. 为了使情报 ...
- [NOIP2010初赛]烽火传递--单调队列优化
问题描述: 烽火台又称烽燧,是重要的军事防御设施,一般建在险要或交通要道上.一旦有敌情发生,白天燃烧柴草,通过浓烟表达信息:夜晚燃烧干柴,以火光传递军情,在某两座城市之间有n个烽火台,每个烽火台发出信 ...
- bzoj1791,P4381-[IOI2008]Island【基环树,树形dp,单调队列dp,树的直径】
正题 评测记录:https://www.luogu.org/recordnew/lists?uid=52918&pid=P4381 题目大意 有n个岛,n条无向边(保证每个岛都有边连到).走过 ...
- P3580 [POI2014]ZAL-Freight(单调队列dp)
P3580 [POI2014]ZAL-Freight(单调队列dp) 考虑两辆车怎么样是最优的. t1,t2,St_1,t_2,St1,t2,S t1+St_1+St1+S 第一辆车:[t1,t ...
- 蓝桥杯备考-刷题之路-动态规划算法(DP算法)Part1
之前在刷力扣的时候就是浑浑噩噩的,照着评论区的答案写了一遍就万事大吉了,没有深度思考过.这次备考蓝桥杯看到DP算法的第一道题就不会,更难受的是看答案了依然完全不理解,所以决心把DP算法一次弄懂. 开始 ...
- Leetcode刷题笔记:栈与队列篇
基础知识 栈和队列的原理大家应该很熟悉了,队列是先进先出,栈是先进后出. 如图所示: 那么我这里再列出四个关于栈的问题,大家可以思考一下.以下是以C++为例,使用其他编程语言的同学也对应思考一下,自己 ...
- POJ 1821 单调队列+dp
题目大意:有K个工人,有n个墙,现在要给墙涂色.然后每个工人坐在Si上,他能刷的最大范围是Li,且必须是一个连续子区间,而且必须过Si,他刷完后能获得Pi钱 思路:定义dp[i][j]表示前i个人,涂 ...
- P3957-跳房子【单调队列,dp,二分】
前言 链接: https://www.luogu.org/record/show?rid=7915892 这就是之前普及组的第四题- 大意 有n个格子,每个格子有价值.机器人有固定的跳跃距离d,用k个 ...
- [力扣刷题总结](栈和单调栈篇)
文章目录 ~~~~~~~~~~~~栈~~~~~~~~~~~~ 155. 最小栈 解法1:链表 剑指 Offer 31. 栈的压入.弹出序列 解法1:模拟栈 20. 有效的括号 解法1:栈 相似题目: ...
最新文章
- R语言数据结构之向量
- Gearman的使用
- redis 配置文件 append only file(aof)部分---数据持久化
- 三点估算pmp_【每日一练】PMP项目管理专业资格认证考试练习题(十)
- python---如何用Python实现iPhone X的人脸解锁功能?
- Web后端学习笔记 Flask(13)memcached
- java 获取本机的IP和hostname
- DNS服务器配置详解
- 泛微oa连接mysql,泛微OA 数据库维护笔记(e-cology)
- 一分钟了解TCP/IP网络通信协议
- 心海软件学生测试系统,心海软件心理管理系统
- 怎么复制图片的html代码,修改设置让你轻松复制网页文字或图片
- LibVLC —— 常用对象解析
- ECMAScript6常用语法
- app微信登陆 小程序微信授权登陆
- nk.bin和nk.nb0
- 可信计算的功能与技术
- Ubuntu 20.04 搜狗输入法安裝
- Java开源企业开发平台教程:待办挂起业务场景实现
- 精品MySQL面试题
热门文章
- 什么是缓存里的脏数据.
- 教你从0到1搭建秒杀系统-订单异步处理
- linux glibc 编译安装,glibc的安装编译
- c# export server 调用sql_[转]使用C#调用cmd来执行sql脚本
- 指定jdk8_动图+源码+总结:深度解析 JDK8 中的数据结构(珍藏版)
- spring boot security ajax_Spring 和 SpringBoot 之间到底有啥区别?
- linux重点知识:网络通信
- 【科普】STP生成树协议
- 盘点 2022 云原生实战峰会产品发布
- 临河天气预报软件测试,临河天气预报15天