烽火台又称烽燧,是重要的军事防御设施,一般建在险要或交通要道上。一旦有敌情发生,白天燃烧柴草,通过浓烟表达信息;夜晚燃烧干柴,以火光传递军情,在某两座城市之间有 n 个烽火台,每个烽火台发出信号都有一定代价。为了使情报准确地传递,在连续 m 个烽火台中至少要有一个发出信号。请计算总共最少花费多少代价,才能使敌军来袭之时,情报能在这两座城市之间准确传递。 
 
Input

第一行:两个整数 N,M。其中N表示烽火台的个数, M 表示在连续 m 个烽火台中至少要有一个发出信号。接下来 N 行,每行一个数 Wi,表示第i个烽火台发出信号所需代价。

Output

一行,表示答案。

Sample Input

5 3  
1  
2  
5  
6  
2

Sample Output

4

Data Constraint

对于50%的数据,M≤N≤1,000 。 对于100%的数据,M≤N≤100,000,Wi≤100。

分析:

定义f[i]为点燃第i个烽火时前i个烽火满足条件的最小值。则状态转移方程为:

f[i]=min(f[j])+a[i].  其中 i-m<=j<=i-1;

由此可以得出一般的解法:

#include <iostream>//烽火传递问题。
using namespace std;
const int inf=1e6+7;
int a[inf];
int f[inf];
/*状态转移方程 :
定义f[i]: 点燃第i个烽火,并且前i个满足条件。
则:f[i]=(min)f[j]+a[i]   i-m<=j<=i-1;  状态转移方程。
*/ int main()
{int n,m;scanf("%d %d",&n,&m);for(int i=1;i<=n;i++)scanf("%d",&a[i]);f[0]=0;for(int i=1;i<=m;i++)f[i]=a[i];for(int i=m+1;i<=n;i++){long long themax= ~(1<<31);for(int j=i-m;j<=i-1;j++){if(f[j]<themax)themax=f[j];           }f[i]=themax+a[i];}long long tmax=1<<30;for(int i=n;i>n-m;i--){if(f[i]<tmax)tmax=f[i];}     cout<<tmax<<endl;return 0;
} 

但是从以上程序中也可以看出复杂度为O(n的平方),对应题目而言显然是不行的,并且注意到是线性结构,求其最小值,所以可以使用单调队列进行优化。单调队列我认为和单调函数差不多,不是单调递增就是单调递减,只要在入队的时候保持队列的单调性就行了,并且弹出比入队元素大的元素就可以了。

代码:

#include <iostream>      //单调队列+dp
using namespace std;
const int inf=1e6+7;
int a[inf];
int que[inf];
int f[inf];
/*
转移方程:f[i]=min(f[j])+a[i];
是从f【i】入队的吧。
*/
int main()
{int n, m;int head=1,tail=0;scanf("%d %d",&n,&m);for(int i=1;i<=n;i++)scanf("%d",&a[i]);for(int i=0;i<n;i++)         //其中的过程,其中的状态转移过程。 {while(tail>=head && f[i]<=f[que[tail]])tail--;   //d出队。que[++tail]=i;while(tail>=head && que[head]<i+1-m)head++;f[i+1]=f[ que[head] ]+a[i+1]; }int ans=~(1<<31);for(int i=n;i>n-m;i--)         ans=min(f[i],ans);cout<<ans<<endl;return 0;
} 

烽火传递(dp+单调队列)相关推荐

  1. 刷题总结——烽火传递(单调队列+dp)

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

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

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

  3. 1089 烽火传递(单调队列优化)

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

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

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

  5. URAL 1427. SMS(DP+单调队列)

    题目链接 我用的比较传统的办法...单调队列优化了一下,写的有点搓,不管怎样过了...两个单调队列,存两个东西,预处理一个标记数组存... 1 #include <iostream> 2 ...

  6. POJ 3017 DP + 单调队列 + 堆

    题意:给你一个长度为n的数列,你需要把这个数列分成几段,每段的和不超过m,问各段的最大值之和的最小值是多少? 思路:dp方程如下:设dp[i]为把前i个数分成合法的若干段最大值的最小值是多少.dp转移 ...

  7. [DP/单调队列]BZOJ 2059 [Usaco2010 Nov]Buying Feed 购买饲料

    首先我想吐槽的是题目并没有表明数据范围... 这个题目 DP方程并不难表示. dp[i][j]表示前i个地点携带了j个货物的最小花费 dp[i][j] = dp[i-1][k] + (j-k) * c ...

  8. bzoj1791,P4381-[IOI2008]Island【基环树,树形dp,单调队列dp,树的直径】

    正题 评测记录:https://www.luogu.org/recordnew/lists?uid=52918&pid=P4381 题目大意 有n个岛,n条无向边(保证每个岛都有边连到).走过 ...

  9. bzoj2500幸福的道路 树形dp+单调队列

    2500: 幸福的道路 Time Limit: 20 Sec  Memory Limit: 256 MB Submit: 434  Solved: 170 [Submit][Status][Discu ...

最新文章

  1. Oracle“死锁”模拟
  2. Spring MVC中用@ResponseBody转json,对json进行处理方法汇总
  3. eclipse error
  4. datasnap——动态注册服务类
  5. ORACLE因为字符集不同,进行中文条件查询,查询结果为空
  6. SAP License:2021年度最新FICO面试题目
  7. Java 用POST方式 传对象给 Servlet
  8. word2vec需要去标点吗_word2vec训练词向量前期处理-中文分词等
  9. python3.7降级3.6_电脑已有Python 3.7 怎么降到Python3.6
  10. Windows每月更新补丁离线安装包下载
  11. maya中英文对照_Maya中英文对照
  12. 小白初学c语言学习计划
  13. Thinkpad X1 Tablet gen2键盘改typec键线分离
  14. excel取消隐藏_Excel教程:教你两招,批量取消隐藏工作表
  15. 项目实训--Unity多人游戏开发(八、3D音效融合AudioMixer、统一的音频播放系统)
  16. onkeyup+onafterpaste 限制文本框只能输入数字 在thinkPHP框架中某些不触发的现象
  17. 神来之笔--图解JVM内存分配及对象存储
  18. 使用uview UI工具库的时间格式化出现的问题
  19. client elapsed: 0 ms, server elapsed: 1022 ms, timeout: 1000 ms,
  20. 分享一些流畅的适合开发的 Android 模拟器

热门文章

  1. MS SQL自定义函数IsPositiveInteger MS SQL自定义函数IsNumeric 水晶报表使用IEnumerableT数据源...
  2. HDU 1232:流问题(并检查集合)
  3. 送给使用phpstorm+thinkphp开发者的福利
  4. Linux文件预读对系统的影响
  5. hdu 1251 统计难题(字典树)
  6. 网站建设PHP中mysql和mysqli的区别
  7. python操作docker SDK:Docker SDK for Python
  8. 解决docker报错: ---> [Warning] IPv4 forwarding is disabled. Networking will not work.
  9. 【网址收藏】k8s PLEG介绍及不健康问题排查
  10. docker安装mysql及相关配置、运行细节和常见报错解决方案