显然的DP题.....

对于位置i,它由i-r~i-l的位置转移过来,容易得到方程 dp[i]=dp[i]+max(dp[i−r],...,dp[i−l])。

第一种:n2的暴力,只能拿部分分。

  1. 1 #include<bits/stdc++.h>
  2. 2 using namespace std;
  3. 3 const int N=2e5+5,inf=0x3f3f3f3f;
  4. 4 int n,l,r,a[N],dp[N],ans=-inf;
  5. 5
  6. 6 int main(){
  7. 7 scanf("%d%d%d",&n,&l,&r);
  8. 8 for(int i=0;i<=n;i++) scanf("%d",&a[i]);
  9. 9 memset(dp,-0x3f,sizeof(dp));
  10. 10 dp[0]=0;
  11. 11 for(int i=l;i<=n+r;i++){
  12. 12 for(int j=max(i-r,0);j<=i-l;j++){
  13. 13 dp[i]=max(dp[i],dp[j]+a[i]);
  14. 14 }
  15. 15 if(i>n) ans=max(ans,dp[i]);
  16. 16 }
  17. 17 cout<<ans;
  18. 18 }

注意细节:i从l到n+r枚举,i-r可能为负导致越界,所以取max(i-r,0);

第二种:单调队列优化,max(dp[i−r],...,dp[i−l])就是找这个区间中的最大值,类似于滑动窗口的思想,建立一个单减的队列。

  1. 1 #include<bits/stdc++.h>
  2. 2 using namespace std;
  3. 3 const int N=2e5+5;
  4. 4 int dp[N],q[N],a[N],n,l,r,ans=-0x3f3f3f3f;
  5. 5
  6. 6 int main(){
  7. 7 scanf("%d%d%d",&n,&l,&r);
  8. 8 for(int i=0;i<=n;i++) scanf("%d",&a[i]);
  9. 9 memset(dp,-0x3f,sizeof(dp));
  10. 10 dp[0]=0;
  11. 11 int h=1,t=0;
  12. 12 for(int i=l;i<=n;i++){
  13. 13 while(h<=t && dp[q[t]]<=dp[i-l]) t--;
  14. 14 q[++t]=i-l;
  15. 15 while(h<=t && q[h]<i-r) h++;
  16. 16 dp[i]=dp[q[h]]+a[i];
  17. 17 }
  18. 18 for(int i=n-r+1;i<=n;i++)
  19. 19 ans=max(ans,dp[i]);
  20. 20 cout<<ans<<endl;
  21. 21 }

第三种:堆优化(大根堆),思想和上一种差不多,都是维护区间最大值,(个人感觉堆优化的代码要简单一小小小些)

  1. 1 #include<bits/stdc++.h>
  2. 2 using namespace std;
  3. 3 const int N=2e5+5,inf=0x3f3f3f3f;
  4. 4 int n,l,r,dp[N],a[N],ans=-inf;
  5. 5 struct node{
  6. 6 int p,val;
  7. 7 friend bool operator < (node a,node b){
  8. 8 return a.val<b.val;//大根堆
  9. 9 }
  10. 10 };
  11. 11 priority_queue<node> q;
  12. 12 int main(){
  13. 13 scanf("%d%d%d",&n,&l,&r);
  14. 14 memset(dp,-0x3f,sizeof(dp));
  15. 15 for(int i=0;i<=n;i++) scanf("%d",&a[i]);
  16. 16 dp[0]=0;
  17. 17 for(int i=l;i<=n;i++){
  18. 18 q.push((node){i-l,dp[i-l]});
  19. 19 while(q.top().p<i-r) q.pop();
  20. 20 dp[i]=q.top().val+a[i];
  21. 21 }
  22. 22 for(int i=n-r+1;i<=n;i++)
  23. 23 ans=max(ans,dp[i]);
  24. 24 cout<<ans;
  25. 25 }

对于这种题,要写出DP方程,观察式子看能不能使用数据结构来优化,可能优化方式不止一种。

洛谷P1725 琪露诺 (单调队列/堆优化DP)的更多相关文章

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

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

  2. 洛谷 P1725 琪露诺 题解

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

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

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

  4. 洛谷P1725 琪露诺

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

  5. 洛谷—— P1725 琪露诺

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

  6. Luogu【P1725】琪露诺(单调队列,DP)

    本文是笔者第二篇解题报告.从现在开始,会将练的一些题发到博客上并归类到"解题报告"标签中. 琪露诺是这样一道题 这道题可以用纯DP做,但是据说会超时.(为什么?看起来过河这题比它数 ...

  7. [洛谷P3693]琪露诺的冰雪小屋

    题目大意:琪露诺的冰雪小屋,我做的第一道大模拟题. 题解:模拟... 卡点:无数小错误,要是没有写一点调一点,那大概是永远调不出来了... C++ Code: #include <cstdio& ...

  8. luoguP1725 琪露诺 单调队列

    DP 方程:$f[i]=max(f[j])+v[i]$ 转移范围:$i-r<=j<=i-l$ 由此我们得知,每次只有 $[i-r,i-l]$ 部分的 $f$ 值对新更新的答案会有贡献. 故 ...

  9. P1725 琪露诺

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

随机推荐

  1. B+树索引页大小是如何确定的?

    B+树简介 在正式介绍本文的主题前,需要对 B+ 树有一定的了解,B+树是一种磁盘上数据的索引结构,大概长这个样子. B+树的叶子节点是所有的数据,非叶子节点称为索引页,索引页里有若干个索引项,本例中 ...

  2. 趣味问题《寻人启事》的Python程序解决

    偷懒了很久,今天我终于又来更新博客了~ 最近,我看到了一个趣味问题,或者说是数学游戏:<寻人启事>. 在表述这个问题前,我们需要了解一下"冰雹猜想": 对于任意一个正整 ...

  3. SQL注入 基础学习

    SQL注入学习笔记 注入原理 SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有 ...

  4. 【原创】Magisk Root隐藏模块 Shamiko安装

    本文所有教程及源码.软件仅为技术研究.不涉及计算机信息系统功能的删除.修改.增加.干扰,更不会影响计算机信息系统的正常运行.不得将代码用于非法用途,如侵立删! Root隐藏模块 Shamiko安装 操 ...

  5. ​在Docker中部署GreatSQL并构建MGR集群

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 为了方面社区用户体验GreatSQL,我们同时还提供Docker镜像,本文详细介绍如何在Docker中部署GreatSQL ...

  6. 笃情开源:我和 Apache DolphinScheduler 社区的故事

    背景 本文的主人翁是 2 次飞机参会现场交流,四天研究就把 DolphinScheduler 用上生产的来自车联网行业的大数据 boy - 黄立同学.怎么样,听起来是不是有点 crazy?下面就来看看 ...

  7. Apache DolphinScheduler 使用文档(6/8):任务节点类型与任务参数设置

    本文章经授权转载,原文链接: https://blog.csdn.net/MiaoSO/article/details/104770720 目录 6. 任务节点类型和参数设置 6.1 Shell节点 ...

  8. SPI:Java的高可扩展利器

    摘要:JAVA SPI,基于接口的编程+策略模式+配置文件的动态加载机制. 本文分享自华为云社区<一文讲透Java核心技术之高可扩展利器SPI>,作者: 冰 河. SPI的概念 JAVA ...

  9. HCIA-Datacom 4.1 实验一:访问控制列表配置实验

    实验介绍 访问控制列表ACL(Access Control List)是由一条或多条规则组成的集合.所谓规则,是指描述报文匹配条件的判断语句,这些条件可以是报文的源地址.目的地址.端口号等.ACL本质 ...

  10. HttpServletResponse 类

    HttpServletResponse 类的作用 HttpServletResponse 类和 HttpServletRequest 类一样.每次请求进来,Tomcat 服务器都会创建一个 Respo ...