打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
2020.2.25普及C组 跳棋(jump) 【纪中】【DP】【单调队列优化】

这道题的DP其实蛮简单的 (但我没想出来)
主要就是在单调队列优化这方面
那我就再提一次吧!

本题的单调队列优化

这里的队列并不是直接取伤害的值,而是存着地址
我们可以通过qqq(队列)中的元素来找到dp中的元素
那么我们认为q[h]q[h]q[h]存着最低伤害的方案

为了保证f[i]f[i]f[i]取qqq中元素是合法的,也就是说,qqq中的元素必须在i−R−1i-R-1i−R−1以内,不然跳不到iii上面。

所以要加上这一句:
while(h<=t&&q[h]<i-R-1) h ;


会了本题的单调队列之后就能做了

#include<iostream>#include<cstring>#include<cstdio>#include<cmath>using namespace std;int n,l,r,f[1000010],a[1000010];int h,t,q[1000010];int main(){    freopen("jump.in","r",stdin);    freopen("jump.out","w",stdout);    cin>>n>>l>>r;    for(int i=1; i<=n; i  )     {     	cin>>a[i];     	f[i]=16843009;     }    h=1;    for(int i=1; i<=n; i  )     {     	if(i-l-1>=0)     	 {     	 	while(h<=t&&f[q[t]]>=f[i-l-1])     	 	 t--;     	 	t  ;     	 	q[t]=i-l-1;     	 }     	while(h<=t&&q[h]<i-r-1)     	  h  ;     	if(h<=t)     	  f[i]=a[i] f[q[h]];     }   if(f[n]<16843009)     cout<<f[n];   else     cout<<-1;   return 0;
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
C++之笔试题基础45 盘古游戏:笔试,打印机
c++stack容器介绍
如何实现循环队列
queue以及使用举例--C++基础
在linux下,用c++删除一个文件夹下的所有文件,不能删除文件夹本身
0-1背包 (20分)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服