单调队列优化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;…

如何解决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)和性能事件的支持,它以事件驱动型的方式工作,通过…

(笔记)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…

【漏洞复现】科立讯通信有限公司指挥调度管理平台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;从这条信息上我…

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

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

华为手机改变休眠时间 不让手机动不动黑屏

在手机中找到设置 并打开 在里面找到显示与亮度 并点开 找到并点击休眠操作项 然后就会弹出 多久进入休眠 可以调久一点

程序员学长 | 快速学会一个算法模型,LSTM

本文来源公众号“程序员学长”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;快速学会一个算法模型&#xff0c;LSTM 今天&#xff0c;给大家分享一个超强的算法模型&#xff0c;LSTM。 LSTM&#xff08;Long Short-Term Memory…

落石滑坡监测报警系统:创新保障高速公路安全

​ ​​在现代交通建设中&#xff0c;高速公路的安全性和稳定性至关重要。特别是易发生落石区域&#xff0c;如何有效预防和应对落石滑坡带来的事故成为了一项关键性挑战。为此&#xff0c;落石滑坡监测报警系统应运而生&#xff0c;它通过先进的技术手段&#xff0c;为高速…

Coursera耶鲁大学金融课程:Financial Markets 笔记Week 03

Financial Markets 本文是学习 https://www.coursera.org/learn/financial-markets-global这门课的学习笔记 这门课的老师是耶鲁大学的Robert Shiller https://en.wikipedia.org/wiki/Robert_J._Shiller Robert James Shiller (born March 29, 1946)[4] is an American econom…

CMake(1)基础使用

CMake之(1)基础使用 Author: Once Day Date: 2024年6月29日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章可参考专栏: Linux实践记录_Once-Day的博客-CSDN博客…