单调队列优化DP——AcWing 135. 最大子序和

单调队列优化DP

定义

单调队列优化DP是一种在动态规划(Dynamic Programming, DP)中应用的数据结构优化方法。它利用单调队列(Monotonic Queue)这一数据结构来高效维护一个区间内的最值(通常是最大值或最小值),从而减少DP状态的计算量,提升算法效率。单调队列内部保持元素的单调性(递增或递减),并能快速地在队列头部获取区间最值,同时在队列尾部进行元素的插入与删除以维持单调性。

运用情况

  1. 区间最大/最小值问题:如求一个序列中所有长度为k的子数组中的最大值最小化(或最小值最大化)问题。
  2. 滑动窗口问题:如寻找一个长度为k的子序列,使其和最大。
  3. 动态规划状态优化:在某些动态规划问题中,状态转移依赖于前i个元素中的最大值或最小值,这时可以使用单调队列来避免直接遍历前i个元素。

注意事项

  1. 维护单调性:确保队列中的元素按照所需的单调性排列(递增或递减),这是单调队列的基础。
  2. 队列更新策略:当新元素加入时,及时从队列尾部移除不再影响区间最值的元素,保持队列大小不会无限增长。
  3. 边界处理:正确处理队列的初始化和结束条件,避免越界错误。
  4. 空间效率:虽然单调队列可以显著提高时间效率,但也要注意其对空间的占用,特别是在大规模数据处理时。

解题思路

  1. 明确问题:识别问题中涉及的区间最值查询需求,判断是否可以通过维护单调性来优化。
  2. 状态定义:定义DP状态,明确状态转移方程。
  3. 引入单调队列:设计队列的插入与删除规则,确保队列始终保持所需单调性,并能快速提供区间最值。
  4. 状态转移优化:利用单调队列查询区间最值代替遍历,优化DP状态的计算。
  5. 实现细节:编写代码实现,特别注意队列的维护逻辑,确保在每个DP状态转移时正确更新队列。
  6. 验证与调试:检查边界条件和特殊情况,确保算法的正确性和效率。

AcWing 135. 最大子序和

题目描述

135. 最大子序和 - AcWing题库

运行代码

#include <iostream>
using namespace std;
const int N = 3E5 + 10;int n, m;
int a[N], q[N];int main()
{cin >> n >> m;for(int i = 1; i <= n; i ++ ) cin >> a[i], a[i] += a[i - 1];long long res = -3E9;int hh = 0, tt = 0;for(int i = 1; i <= n; i ++ ){if(i - q[hh] > m) hh ++;res = max(res, 1ll * a[i] - a[q[hh]]);while(hh <= tt && a[i] <= a[q[tt]]) tt --;q[ ++ tt] = i;}cout << res;
}

代码思路

  1. 输入与预处理:

    • 首先读入两个整数n和m,分别代表序列的长度和需要考虑的子数组长度。
    • 接着读入一个长度为n的整数序列a[],并通过累加生成一个新的序列,使得a[i]表示原序列前i个元素的和。这种预处理是为了方便计算任意子数组的和。
  2. 单调队列设计:

    • 定义一个单调递减的双端队列q[],用来存储序列a[]的索引。队列中的元素索引对应的a值是递减的,这样队头元素总是队列中对应a值最大的位置。
    • 初始化队列的头指针hh和尾指针tt为0。
  3. 遍历与优化:

    • 遍历更新序列a[]的每一个元素i时,首先检查队列中的最前面的索引是否超出了当前子数组长度m的范围,如果超出了则从队列头部弹出索引,保证队列中的都是可能参与形成长度为m的子数组的索引。
    • 计算当前子数组a[q[hh]]到a[i]的和,并更新结果res为这个和与当前最大差值中的较大者。这样做的目的是找到最大的子数组和,因为我们要找的是这些和中的最小值,所以用负数表示并取最大值来间接实现。
    • 维护单调队列的性质:如果新加入的a[i]比队列尾部的元素小(即a[q[tt]] >= a[i]),说明队尾元素不可能再成为未来更优解的一部分,因此将其从队列中移除。然后将当前索引i加入队列尾部。
  4. 输出结果:遍历结束后,变量res存储了所有长度为m的子数组和的最大值的负数形式,输出其正值即为所求的最小值。

改进思路

  1. 明确注释:添加详细的注释,尤其是对于算法核心逻辑部分,可以帮助阅读者更快理解代码意图。

  2. 变量命名清晰化:虽然hhttq[]等变量在竞赛编程中较为常见且简短,但对于长期维护的项目,使用更具描述性的变量名如queueHeadqueueTailindicesQueue[]可能会更好。

  3. 常量定义:将负无穷大(-3E9)这样的magic number定义为常量,提高代码可读性和可维护性。例如,定义const long long INF = -3E9;

  4. 异常处理:考虑增加对输入数据的合法性检查,比如n和m是否合理,输入数组是否有非法值等。

  5. 优化输出格式:对于输出结果,根据实际需要可能要调整格式,比如添加单位、保留小数等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/37613.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++输出彩色方块

1.使用方法 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0xab); ———————————————————————————————————————— 0 黑色 1 蓝色 2 绿色 3 湖蓝色 4 红色 5 紫色 6 黄色 7 白色 8 灰色 9 …

QT事件处理及实例(鼠标事件、键盘事件、事件过滤)

这篇文章通过鼠标事件、键盘事件和事件过滤的三个实例介绍事件处理的实现。 鼠标事件及实例 鼠标事件包括鼠标的移动、按下、松开、单击和双击等。 创建一个MouseEvent项目&#xff0c;通过项目介绍如何获得和处理鼠标事件。程序效果如下图所示。 界面布局代码如下&#xff…

算法金 | K-均值、层次、DBSCAN聚类方法解析

大侠幸会&#xff0c;在下全网同名「算法金」 0 基础转 AI 上岸&#xff0c;多个算法赛 Top 「日更万日&#xff0c;让更多人享受智能乐趣」 聚类分析概述 聚类分析的定义与意义 聚类分析&#xff08;Clustering Analysis&#xff09;是一种将数据对象分成多个簇&#xff08;…

大数据面试题之Spark(2)

介绍下Spark Shuffle及其优缺点 什么情况下会产生Spark Shuffle? 为什么要Spark Shuffle? Spark为什么快? Spark为什么适合迭代处理? Spark数据倾斜问题&#xff0c;如何定位&#xff0c;解决方案 Spark的stage如何划分?在源码中是怎么判断属于Shuffle Map Stage或R…

如何解决java程序CPU负载过高问题

1、介绍 在生产环境中&#xff0c;有时会遇到cpu占用过高且一直下不去的场景。这种情况可能会导致服务器宕机&#xff0c;进而中断对外服务&#xff0c;也会影响硬件寿命。 2、原因 1、Java代码存在因递归不当等原因导致的死循环的问题&#xff0c;推荐有条件的循环&#xf…

【Linux】性能分析器 perf 详解(一):简介、安装、stat命令演示

1、简介 perf 是由 Linux 官方提供的系统性能分析工具 。它包含两部分: perf_events ,Linux 内核中的一个子系统perf 命令,用户空间的应用程序内核子系统 perf_events 提供了性能计数器(hardware performance counters)和性能事件的支持,它以事件驱动型的方式工作,通过…

一分钟解决读者和写者问题

长话短说&#xff0c;就是&#xff1a;读、读共享&#xff1b;写、写互斥&#xff1b;写、读互斥。 直接从代码角度分析&#xff1a; 互斥信号量wmutex: 实现Reader与Writer进程间在读和写、写和写时的互斥整型变量readcount: 表示正在读的进程数目互斥信号量rmutex在下文揭秘…

C#编程技术指南:从入门到精通的全面教程

无论你是编程新手&#xff0c;还是想要深化.NET技能的开发者&#xff0c;本文都将为你提供一条清晰的学习路径&#xff0c;从C#基础到高级特性&#xff0c;每一站都配有详尽解析和实用示例&#xff0c;旨在帮助你建立坚实的知识体系&#xff0c;并激发你对C#及.NET生态的热情。…

(笔记)Error: qemu-virgl: Failed to download resource “qemu-virgl--test-image“解决方法

错误&#xff1a; > Downloading https://www.ibiblio.org/pub/micro/pc-stuff/freedos/files/distributions/1.2/FD12FLOPPY.zip curl: (22) The requested URL returned error: 404Error: qemu-virgl: Failed to download resource "qemu-virgl--test-image" D…

基于自组织长短期记忆神经网络的时间序列预测(MATLAB)

LSTM是为了解决RNN 的梯度消失问题而诞生的特殊循环神经网络。该网络开发了一种异于普通神经元的节点结构&#xff0c;引入了3 个控制门的概念。该节点称为LSTM 单元。LSTM 神经网络避免了梯度消失的情况&#xff0c;能够记忆更长久的历史信息&#xff0c;更能有效地拟合长期时…

SpringBoot: Eureka入门

1. IP列表 公司发展到一定的规模之后&#xff0c;应用拆分是无可避免的。假设我们有2个服务(服务A、服务B)&#xff0c;如果服务A要调用服务B&#xff0c;我们能怎么做呢&#xff1f;最简单的方法是让服务A配置服务B的所有节点的IP&#xff0c;在服务A内部做负载均衡调用服务B…

Unity3D游戏开发中常用的工具类函数详解

在Unity3D游戏开发中&#xff0c;工具类函数扮演着至关重要的角色&#xff0c;它们为开发者提供了各种便捷的功能&#xff0c;从而简化了游戏开发过程。本文将详细介绍Unity3D中一些常用的工具类函数&#xff0c;并提供相应的技术详解和代码实现。 对惹&#xff0c;这里有一个…

【漏洞复现】科立讯通信有限公司指挥调度管理平台uploadgps.php存在SQL注入

0x01 产品简介 科立讯通信指挥调度管理平台是一个专门针对通信行业的管理平台。该产品旨在提供高效的指挥调度和管理解决方案&#xff0c;以帮助通信运营商或相关机构实现更好的运营效率和服务质量。该平台提供强大的指挥调度功能&#xff0c;可以实时监控和管理通信网络设备、…

web前端大作业-乡村扶贫、乡村振兴

文章目录 代码分析页面截图代码连接 代码分析 代码结构 主页index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta…

计算机视觉 图像融合技术概览

在许多计算机视觉应用中(例如机器人运动和医学成像),需要将来自多幅图像的相关信息集成到一幅图像中。这种图像融合将提供更高的可靠性、准确性和数据质量。 多视图融合可以提高图像的分辨率,同时恢复场景的 3D 表示。多模态融合结合了来自不同传感器的图像,称为多传感器融…

【数组】- 螺旋矩阵 II

1. 对应力扣题目连接 螺旋矩阵 II 题目简述&#xff1a; 给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。如图&#xff1a; 2. 实现案例代码 public class SpiralMatrix {public static…

学习gateway网关路由时遇到的问题

遇到这个问题先别慌&#xff0c;我们首先要检查是哪里出问题了&#xff0c;从报错信息中我们可以看到&#xff0c;他说 Unable to find GatewayFilterFactory with name -AddRequestHeader 找不到这个路由过滤器&#xff0c;所以导致网关设置失败&#xff0c;从这条信息上我…

Java面试题:讨论你如何保持对Java生态系统中新技术的了解

保持对Java生态系统中新技术的了解可以通过以下几种方法&#xff1a; 官方资源&#xff1a; Oracle的官方博客和新闻&#xff1a;Oracle是Java的主要维护者&#xff0c;其官方网站和博客会定期发布Java的新版本、功能更新和最佳实践。Java SE Documentation&#xff1a;Java官方…

JS(JavaScript)二级菜单级联案例演示

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…