【题目描述:】

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

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

小河可以看作一列格子依次编号为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:]

 1 //P1725 琪露诺
 2 #include<iostream>
 3 #include<cstdio>
 4 #include<algorithm>
 5 #include<queue>
 6 using namespace std;
 7
 8 const int MAXN = 200000 + 1;
 9
10 int n, l, r;
11 int a[MAXN];
12 int f[MAXN];
13 struct Node {
14     int v, num;
15 };
16
17 deque<Node> q;
18
19 inline int read() {
20     int x=0, f=1; char ch=getchar();
21     while(ch<'0' || ch>'9') {
22         if(ch == '-') f = -1;
23         ch = getchar();
24     }
25     while(ch>='0' && ch<='9')
26         x=(x<<3)+(x<<1)+ch-48, ch=getchar();
27     return x * f;
28 }
29
30 int main() {
31     n = read(), l = read(), r = read();
32     for(int i=0; i<=n; ++i)
33         a[i] = read();
34     int p = 0;
35     for(int i=l; i<=n; ++i) {
36 // 求max{f[i-r, i-l]}
37 //        int maxn = 1 << 31;
38 //        int s = i-r<0 ? 0 : i-r;
39 //        for(int j=s; j<=i-l; ++j)
40 //            maxn = max(maxn, f[j]);
41         while(!q.empty() && q.back().v < f[p])
42             q.pop_back();
43         q.push_back((Node){f[p], p});
44         while(q.front().num + r < i) q.pop_front();
45         f[i] = q.front().v + a[i];
46         ++p;
47     }
48     int ans = 1 << 31;
49     for(int i=n-r+1; i<=n; ++i)
50         ans = max(ans, f[i]);
51     printf("%d\n", ans);
52 }

转载于:https://www.cnblogs.com/devilk-sjj/p/9072387.html

【洛谷】【动态规划+单调队列】P1725 琪露诺相关推荐

  1. 洛谷P1725琪露诺【单调队列+dp】

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

  2. 洛谷 - P1725 琪露诺(动态规划+单调队列优化)

    题目链接:点击查看 题目大意:给出一个由n个节点组成的数轴,每个点上都有一个权值,现在规定当在点x处时,下一步只能去[x+l,x+r]之间的任意一点,现在规定终点是点n之后的所有节点,现在问如何规划路 ...

  3. 东方幻想乡系列模拟赛T2琪露诺题解

    题目地址: http://fzoj.xndxfz.com/JudgeOnline/problem.php?id=2146&csrf=17peCLMJM49glhqlg9KaD7Agf5o5QY ...

  4. UESTC 1808 琪露诺的算术教室 打表+特判(找规律)

    题目 琪露诺是个聪明的精灵,她非常擅长和数字有关的游戏 . 直到有一天灵梦进入了迷雾深林,她遇见了琪露诺,并向她提出了一个问题. 统计n个一位数字a组成的数乘以一位数b的结果中有多少个一位数字d.不超 ...

  5. 洛谷 动态规划一日游 P2577、P1070、P2051

    记 2018年3月19日 贼颓呢,一天就写了两道DP,还都不会写,这可GG. 动态规划真的难且有趣,算法题中动态规划占到了很大的比例,而且动态规划往往是辅助解决一些其他类型问题的基础,加深加强对动态规 ...

  6. HDU5470 Typewriter SAM 动态规划 单调队列

    原文链接https://www.cnblogs.com/zhouzhendong/p/HDU5470.html 题目传送门 - HDU5470 题意 你需要写一个只包含小写字母的字符串 $s$ . 你 ...

  7. [NOI2005]瑰丽华尔兹 动态规划 + 单调队列

    Description 你跳过华尔兹吗?当音乐响起,当你随着旋律滑动舞步,是不是有一种漫步仙境的惬意?众所周知,跳华尔兹时,最重要的是有好的音乐.但是很少有几个人知道,世界上最伟大的钢琴家一生都漂泊在 ...

  8. UOJ#172. 【WC2016】论战捆竹竿 字符串 KMP 动态规划 单调队列 背包

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ172.html 题解 首先,这个问题显然是个背包问题. 然后,可以证明:一个字符串的 border 长度可 ...

  9. 【DP、线段树优化】琪露诺

    跟去年(2017)PJ第四题几乎是一样的?/吐血 DP方程可以很简单的推出来,f[i]=max{f[k]}+a[i] 然而这样做是O(n^2)的 看一下数据,200000的话要不nlogn 要不n 由 ...

最新文章

  1. IBM人工智能将“掌舵”全球首个跨大西洋自主驾驶船舶
  2. Ajax之Jquery封装使用举例2(Json和JsonArray处理)
  3. Imageloader5-ImageLoader的变量初始化
  4. 后台接收数组_「面试必备」最新整理出的腾讯C++后台开发面试笔记
  5. isOnSyncQueue
  6. 数据库系统故障相关知识笔记
  7. C语言编程笔记:关于 for循环 的那些不为人知的秘密
  8. 数学笔记3——导数3(隐函数的导数)
  9. conda pip安装在哪里_Python环境篇-Minicondaamp;Pip使用汇总
  10. 【OpenCV 例程200篇】21. 图像的叠加
  11. 基于鸿蒙Hi3861和华为云平台的烟雾报警器(附源码)
  12. 林洋能源:布局能源互联网 分布式光伏龙头再扬帆
  13. 仿九天音乐图片切换技术[二],兼容ie,ff
  14. 【点阵液晶编程连载五】液晶驱动代码的移植
  15. modbus rtu与计算机通讯,关于modbus rtu一个主站与多个从站通信的一点总结
  16. Ubuntu系统如何进行屏幕截图
  17. MDK5中F103C8T6的RCC时钟配置时指向RCC_AHB1PeriphClockCmd但报错identifier “RCC_AHB1Periph_GPIOB is undefined的解决
  18. 002产品经理用户访谈和问卷调查的目的和设计步骤
  19. was unable to send heartbeat
  20. php 屏蔽 strict standards,PHP Strict Standards:问题解决

热门文章

  1. 【Tools】开源远程控制神器之RustDesk
  2. php 追溯,php 无限分类父子追溯方法
  3. 联机装箱问题 java_Java实现 洛谷 P1049 装箱问题
  4. java 自写项目 war包 部署到linux上 本地可以正常运行,部署正常但访问404问题
  5. HTTP协议学习笔记(一)请求方法名及状态码
  6. 1015 德才论 (25 分)(c语言)
  7. spark里的hbase的ImmutableBytesWritable的打印问题scala
  8. caffe训练输入数据格式介绍(LMDB/imagelist)
  9. OllyDbg的一些快捷键
  10. #pragma comment和#pragma 预处理指令详解