【题目描述:】

在幻想乡,琪露诺是以笨蛋闻名的冰之妖精。

某一天,琪露诺又在玩速冻青蛙,就是用冰把青蛙瞬间冻起来。但是这只青蛙比以往的要聪明许多,在琪露诺来之前就已经跑到了河的对岸。于是琪露诺决定到河岸去追青蛙。

小河可以看作一列格子依次编号为0到N,琪露诺只能从编号小的格子移动到编号大的格子。而且琪露诺按照一种特殊的方式进行移动,当她在格子i时,她只移动到区间[i+l,i+r]中的任意一格。你问为什么她这么移动,这还不简单,因为她是笨蛋啊。

每一个格子都有一个冰冻指数A[i],编号为0的格子冰冻指数为0。当琪露诺停留在那一格时就可以得到那一格的冰冻指数A[i]。琪露诺希望能够在到达对岸时,获取最大的冰冻指数,这样她才能狠狠地教训那只青蛙。

但是由于她实在是太笨了,所以她决定拜托你帮它决定怎样前进。

开始时,琪露诺在编号0的格子上,只要她下一步的位置编号大于N就算到达对岸。

【输入格式:】

第1行:3个正整数N, L, R

第2行:N+1个整数,第i个数表示编号为i-1的格子的冰冻指数A[i-1]

【输出格式:】

一个整数,表示最大冰冻指数。保证不超过231-1

[算法分析:]

一道典型的DP题,已知a[i]为点i的冰冻指数,设f[i]为到达点i时获得的最大冰冻指数

则f[i]的状态是由f[i+l, i+r]转移来的

即f[r]的状态是由f[i-r, i-l]得到的.

可以求得状态转移方程:

  f[i] = max{f[i - j]} + a[i]

  l <= j <= r <= i

时间复杂度为O(n2),n ≤ 200000 的范围显然是超时了.

考虑如何优化:

显然对于求max{f[i - j]}的过程是可以优化的,

用优先队列或者线段树?O(n log2 n)确实是一个很优秀的复杂度,但是还有更优的:

单调队列,时间复杂度为O(n).

每次把一个f[p]值放入deque中,维护序列的单调性(从大到小),

但如果某一次队头的元素的坐标已经不足以跳到当前点了,就要把队首pop出去

所以deque中存放的应是一个结构体或者pair.

那有没有可能在pop队尾的时候把之后的最优解pop掉呢?

现在要加入队列的元素坐标一定比队尾元素要大,而其值也比需要被pop掉的队尾元素大,

所以最优解不管怎么pop都会在队列里。

[Code:]

 //P1725 琪露诺
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std; const int MAXN = + ; int n, l, r;
int a[MAXN];
int f[MAXN];
struct Node {
int v, num;
}; deque<Node> q; inline int read() {
int x=, f=; char ch=getchar();
while(ch<'' || ch>'') {
if(ch == '-') f = -;
ch = getchar();
}
while(ch>='' && ch<='')
x=(x<<)+(x<<)+ch-, ch=getchar();
return x * f;
} int main() {
n = read(), l = read(), r = read();
for(int i=; i<=n; ++i)
a[i] = read();
int p = ;
for(int i=l; i<=n; ++i) {
// 求max{f[i-r, i-l]}
// int maxn = 1 << 31;
// int s = i-r<0 ? 0 : i-r;
// for(int j=s; j<=i-l; ++j)
// maxn = max(maxn, f[j]);
while(!q.empty() && q.back().v < f[p])
q.pop_back();
q.push_back((Node){f[p], p});
while(q.front().num + r < i) q.pop_front();
f[i] = q.front().v + a[i];
++p;
}
int ans = << ;
for(int i=n-r+; i<=n; ++i)
ans = max(ans, f[i]);
printf("%d\n", ans);
}

【洛谷】【动态规划+单调队列】P1725 琪露诺的更多相关文章

  1. 洛谷P1725琪露诺(单调队列优化dp)

    P1725 琪露诺 题目描述 在幻想乡,琪露诺是以笨蛋闻名的冰之妖精.某一天,琪露诺又在玩速冻青蛙,就是用冰把青蛙瞬间冻起来.但是这只青蛙比以往的要聪明许多,在琪露诺来之前就已经跑到了河的对岸.于是琪 ...

  2. 洛谷 P1725 琪露诺 题解

    P1725 琪露诺 题目描述 在幻想乡,琪露诺是以笨蛋闻名的冰之妖精. 某一天,琪露诺又在玩速冻青蛙,就是用冰把青蛙瞬间冻起来.但是这只青蛙比以往的要聪明许多,在琪露诺来之前就已经跑到了河的对岸.于是 ...

  3. P1725 琪露诺

    P1725 琪露诺 单调队列优化dp 对于不是常数转移的dp转移,我们都可以考虑单调队列转移 然而我们要把数组开大 #include<cstdio> #include<algorit ...

  4. luogu P1725 琪露诺

    二次联通门 : luogu P1725 琪露诺 /* luogu P1725 琪露诺 DP + 线段树 用线段树维护dp[i - R] ~ dp[i - L]的最大值 然后 转移方程是 dp[i] = ...

  5. P1725 琪露诺(单调队列优化)

    描述:https://www.luogu.com.cn/problem/P1725 小河可以看作一列格子依次编号为0到N,琪露诺只能从编号小的格子移动到编号大的格子.而且琪露诺按照一种特殊的方式进行移 ...

  6. 洛谷P1725 琪露诺

    传送门啦 本人第一个单调队列优化 $ dp $,不鼓励鼓励? 琪露诺这个题,$ dp $ 还是挺好想的对不,但是暴力 $ dp $ 的话会 $ TLE $ ,所以我们考虑用单调队列优化. 原题中说她只 ...

  7. 洛谷—— P1725 琪露诺

    https://www.luogu.org/problem/show?pid=1725 题目描述 在幻想乡,琪露诺是以笨蛋闻名的冰之妖精.某一天,琪露诺又在玩速冻青蛙,就是用冰把青蛙瞬间冻起来.但是这 ...

  8. P1725 琪露诺 题解(单调队列)

    题目链接 琪露诺 解题思路 单调队列优化的\(dp\). 状态转移方程:\(f[i]=max{f[i-l],f[i-l+1],...,f[i-r-1],f[i-r]}+a[i]\) 考虑单调队列优化. ...

  9. 洛谷P1725 琪露诺 (单调队列/堆优化DP)

    显然的DP题..... 对于位置i,它由i-r~i-l的位置转移过来,容易得到方程 dp[i]=dp[i]+max(dp[i−r],...,dp[i−l]). 第一种:n2的暴力,只能拿部分分. 1 ...

随机推荐

  1. SpringBean 工作原理详解

    本文来自Github开源项目https://github.com/Snailclimb/JavaGuide,只供自己学习总结无商业用途,如有侵权,联系删除 前言 在 Spring 中,那些组成应用程序 ...

  2. 【原】Docker入门之Centos7.0+安装

    服务器配置:1核2G 40G 硬盘,Centos 7.4. 以下全程是在 root 用户下操作: 1.卸载旧版本 yum remove docker \ docker-client \ docker- ...

  3. JVM GC总结

    判断对象存活 引用计数算法 给对象中添加一个引用计数器,每当有一个地方引用它时,计数器就加1,引用失效时,计数器就减1:任何时刻计数器都为0的对象就是不可能再被使用的. 问题:无法解决对象之间的相互循 ...

  4. SpringBoot集成Jersey

    SpringBoot集成Jersey 添加依赖 <dependency> <groupId>org.springframework.boot</groupId> & ...

  5. VS本地调试 Visual Studio远程调试监视器(MSVSMON.EXE)的32位版本不能用于调试64位进程或64位转储

    vs2017 调试一致都没啥问题,今天莫名报这个错误,感觉好奇怪,网上搜索了半天也没解决,最后看着错误信息感觉很诡异,我本地调试你给我启动远程调试监测器干嘛,localhost也访问不了,ping了一 ...

  6. 实用的Javascript获取网页屏幕可见区域高度

    本文转载原地址:这里 document.body.clientWidth ==> BODY对象宽度 document.body.clientHeight ==> BODY对象高度 docu ...

  7. axTOCControl右键

    private void axTOCControl1_OnMouseDown(object sender, ITOCControlEvents_OnMouseDownEvent e) { if (e. ...

  8. CentOS7系列--5.3CentOS7中配置和管理Kubernetes

    CentOS7配置和管理Kubernetes Kubernetes(k8s)是自动化容器操作的开源平台,这些操作包括部署,调度和节点集群间扩展.如果你曾经用过Docker容器技术部署容器,那么可以将D ...

  9. C# SqlConnection连接sql server

    try { SqlConnection conn = new SqlConnection(); conn.ConnectionString = "Data Source=127.0.0.1; ...

  10. Pig limit用法举例

    lmt = limit data 10;   只获取指定条数的数据,不能保证每次得到的结果一致,先执行order再limit可以保证一致.   输入数据全部载入.   会触发reduce阶段   a ...