烽火传递 dp+单调队列
来源:互联网 发布:视频监控软件破解版 编辑:程序博客网 时间:2024/04/27 20:25
题目大意
烽火台又称烽燧,是重要的军事防御设施,一般建在险要或交通要道上。一旦有敌情发生,白天燃烧柴草,通过浓烟表达信息;夜晚燃烧干柴,以火光传递军情,在某两座城市之间有n个烽火台,每个烽火台发出信号都有一定代价。为了使情报准确地传递,在连续m个烽火台中至少要有一个发出信号。请计算总共最少花费多少代价,才能使敌军来袭之时,情报能在这两座城市之间准确传递。
分析
要用动态规划的方法解决。我们可以写出这样的方程f[i]:=min{f[j]}+a[i](i-m<=j<i-1)(因为要保证i之前的3个中必须存在被点亮的烽火台)。
那问题就变成了在f[i-m]到f[i-1]中找一个最小的。
单调队列可以很好地完成这个任务。
单调队列见——单调队列
代码
var a:array[0..1000001] of longint; d,v:array[0..1000001] of longint; f:array[0..1000001] of longint; head,tail:longint; i,j,k:longint; n,m:longint; ans:longint;begin readln(n,m); for i:=1 to n do readln(a[i]); fillchar(d,sizeof(d),0); fillchar(v,sizeof(v),0); head:=1; tail:=0; for i:=1 to n do begin while (v[head]<i-m) and (head<=tail) do head:=head+1; while (f[i-1]<f[v[tail]]) and (head<=tail) do tail:=tail-1; tail:=tail+1; v[tail]:=i-1; f[i]:=f[v[head]]+a[i]; end; ans:=maxlongint; for i:=n-m+1 to n do if ans>f[i] then ans:=f[i]; write(ans);end.
1 0
- 烽火传递 dp+单调队列
- [tyvj1313]烽火传递(单调队列dp)
- 烽火传递 单调队列
- NKOJ 2151【单调队列】烽火传递 单调队列优化DP
- 【例题】【单调队列优化DP】NKOJ2151 烽火传递
- 【tyvj1313】烽火传递(单调队列优化dp)
- <单调队列>3.烽火传递
- NOIP2010 烽火传递 队列DP
- 单调队列之烽火传递问题
- 单调队列——烽火传递
- 烽火传递
- 烽火传递
- 烽火传递
- 烽火传递
- 烽火传递
- 单调队列优化DP
- 单调队列优化DP
- 单调队列+DP
- Mobile Service
- (OK)(OK) using adb with KVM (qemu)
- Python: 什么是*args和**kwargs
- [JAVA]模拟自动售货机
- android 队列形式播放提示语音
- 烽火传递 dp+单调队列
- 自由控制灰度或原色ImageView
- EntityFramework中LINQ To SQL的lumbda表达式的错误应用
- ArrayList中去除重复数据,以及去除重复的自定义对象
- struts2---获得Sevlet对象的2*2种方法
- 一个简单的文件读写实例
- inline内联函数详解
- Party
- Implement Queue using Stacks