单调队列优化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. 优化输出格式:对于输出结果,根据实际需要可能要调整格式,比如添加单位、保留小数等。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

自定义一个背景图片的高度,随着容器高度的变化而变化,小于图片的高度时裁剪,大于时拉伸100%展示

1、通过js创建<image?>标签来获取背景图片的宽高比&#xff1b; 2、当元素的高度大于原有比例计算出来的高度时&#xff0c;背景图片的高度拉伸自适应100%&#xff0c;否则高度为auto&#xff0c;会自动被裁减 3、背景图片容器高度变化时&#xff0c;自动计算背景图片的…

RFID固定资产管理系统在企业中的应用与优势

随着企业资产规模的不断扩大和管理复杂性的增加&#xff0c;传统的资产管理方式已无法满足企业高效管理的需求。RFID固定资产管理系统凭借其高效、准确、实时的特点&#xff0c;成为企业固定资产管理的新宠。 一、什么是RFID固定资产管理系统 RFID&#xff08;无线射频识别&…

浪潮信息存储的灵魂:平台化+场景化 全面释放数据价值

在数字化浪潮的席卷下&#xff0c;浪潮信息存储平台凭借卓越的性能和稳定性&#xff0c;正日益成为企业释放数据价值的重要力量。近日&#xff0c;浪潮信息出席了“2024数据基础设施技术峰会”&#xff0c;相关代表聚焦当前数据价值的释放话题&#xff0c;围绕先进存储基础设施…

CSS|01 CSS简介CSS的3种书写方式注释

CSS简介 什么是CSS CSS&#xff08;Cascading Style Sheet&#xff09;&#xff0c;层叠样式表 或者 级联样式表&#xff0c;简称样式表。CSS的作用 主要用来给 HTML网页 设置外观或者样式。CSS的语法规则 h1 {属性:属性值}注意&#xff1a;1. CSS代码是由选择器和一对括号…

Ubuntu Server 和 Ubuntu Desktop 组合使用

1.常见的组合使用方式 Ubuntu Server 和 Ubuntu Desktop 确实可以组合使用&#xff0c;但具体要看你的需求和使用场景。以下是一些常见的组合使用方式&#xff1a; 单一设备上安装&#xff1a;你可以在一台设备上同时安装 Ubuntu Server 和 Ubuntu Desktop。这样&#xff0c;你…

【ONE·Linux || 高级IO(一)】

总言 主要内容&#xff1a;介绍五种IO模型的基本概念、学习IO多路转接&#xff08;select、poll编程模型&#xff09;。       文章目录 总言1、问题引入1.1、网络通信与IO1.2、五种IO模型1.2.1、举例引入1.2.2、IO模型具体含义介绍1.2.2.1、阻塞式IO1.2.2.2、非阻塞轮询检…

mathcup大数据竞赛论文中集成学习(或模型融合)的运用分析

ps: (模型融合和集成学习是两个紧密相关但又有所区别的概念。集成学习是一种更广泛的范式&#xff0c;而模型融合可以被视为集成学习的一种特殊形式或策略。) 1.集成学习原理 图1 如图1所示&#xff0c;集成学习是一种通过结合多个机器学习模型的预测来提高整体性能的策略。其…

数据结构-循环链表和双向链表

目录 前言一、循环链表1.1 循环链表的介绍1.2 循环链表的实现 二、双向链表总结 前言 本篇文章介绍数据结构中的循环链表和双向链表 一、循环链表 1.1 循环链表的介绍 将单链表的形式稍作改变&#xff0c;单链表的最后一个结点指向第一个结点 对第一个结点概念的说明&#…

Echarts地图实现:山东省报考人数

Echarts地图实现&#xff1a;山东省报考人数 效果预览 设计思路 数据可视化&#xff1a;选择地图作为数据展示的方式&#xff0c;可以直观地展示山东省不同城市的报考人数分布。交互性&#xff1a;通过ECharts的交互功能&#xff0c;如提示框&#xff08;tooltip&#xff09;…

致远互联FE协作办公平台 codeMoreWidget SQL注入致RCE漏洞复现

0x01 产品简介 致远互联FE协作办公平台是一款为企业提供全方位协同办公解决方案的产品。它集成了多个功能模块&#xff0c;旨在帮助企业实现高效的团队协作、信息共享和文档管理。 0x02 漏洞概述 致远互联FE协作办公平台 codeMoreWidget.jsp接口处存在SQL注入漏洞,未经授权攻…

有哪些防爬虫的方法

防爬虫的方法有robots.txt文、user-agent过滤、ip限制、验证码、动态页面生成、频率限制、动态url参数和反爬虫技术等。详细介绍&#xff1a;1、robots.txt文件&#xff0c;用于告诉搜索引擎爬虫哪些页面可以访问&#xff0c;哪些页面禁止访问&#xff1b;2、ip限制&#xff0c…

机器学习入门指南:理解基本概念与常见算法

目录 什么是机器学习&#xff1f; 机器学习的基本概念 1. 训练数据 2. 特征工程 3. 模型评估 监督学习与非监督学习的区别 监督学习 非监督学习 常见的机器学习算法 1. 线性回归与逻辑回归 2. 决策树与随机森林 3. 支持向量机&#xff08;SVM&#xff09; 4. K近邻…

2小时动手学习扩散模型(pytorch版)【入门版】【代码讲解】

2小时动手学习扩散模型&#xff08;pytorch版&#xff09; 课程地址 2小时动手学习扩散模型&#xff08;pytorch版&#xff09; 课程目标 给零基础同学快速了解扩散模型的核心模块&#xff0c;有个整体框架的理解。知道扩散模型的改进和设计的核心模块。 课程特色&#xf…

学生宿舍管理系统

摘 要 随着高校规模的不断扩大和学生人数的增加&#xff0c;学生宿舍管理成为高校日常管理工作中的重要组成部分。传统的学生宿舍管理方式往往依赖于纸质记录和人工管理&#xff0c;这种方式不仅效率低下&#xff0c;而且容易出错&#xff0c;无法满足现代高校管理的需求。因此…

不同node版本的切换及其指定版本vue-cli脚手架下载

目录 一.清空本地已安装node.js版本 二.装nvm管理工具 三.安装指定node版本 四.使用nvm命令切换或删除指定node版本 五.在指定node版本下下载指定vue-cli脚手架 一.清空本地已安装node.js版本 1.按健winR弹出窗口&#xff0c;键盘输入cmd&#xff0c;然后敲回车。 2.输入…

这是我见过的大模型 RAG 优化方案与实践最全总结了

暑期实习基本结束了&#xff0c;校招即将开启。 不同以往的是&#xff0c;当前职场环境已不再是那个双向奔赴时代了。求职者在变多&#xff0c;HC 在变少&#xff0c;岗位要求还更高了。提前准备才是完全之策。 最近&#xff0c;我们又陆续整理了很多大厂的面试题&#xff0c…

QT基本对话框(基本对话框、工具盒类、进度条、调色板与电子钟、可扩展对话框、程序启动画面)

此篇文章通过实例介绍基本对话框的用法。首先介绍标准文件对话框&#xff08;QFileDialog&#xff09;、标准颜色对话框&#xff08;QColorDialog&#xff09;、标准字体对话框&#xff08;QFontDialog&#xff09;、标准输入对话框&#xff08;QInputDialog&#xff09;以及标…

VMware ESXi 技术

目录 一、VMware ESXi安装 1. 在VMware WorkStation中创建一台虚拟机 2. 进入VMware ESXi控制台 3. 配置VMware ESXi网络 二、使用Web网页端登录管理ESXi 1. 分配许可证密钥&#xff08;选做&#xff09; 2. 管理ESXi 三、VMware ESXi控制台 1. 创建虚拟机 2. 定制虚拟…

laravel Dcat Admin 入门应用(七)列copyable和自定义copy

laravel Dcat Admin 入门应用&#xff08;七&#xff09;列copyable和自定义copy Dcat Admin 是一个基于 Laravel-admin 二次开发而成的后台构建工具&#xff0c;只需很少的代码即可构建出一个功能完善的高颜值后台系统。支持页面一键生成 CURD 代码&#xff0c;内置丰富的后台…

深入了解Qt 控件:Display Widgets部件(1) 以及 QT自定义控件(电池)

QT自定义控件(电池&#xff09; Chapter1 QT自定义控件(电池&#xff09;Chapter2 Qt教程 — 3.5 深入了解Qt 控件&#xff1a;Display Widgets部件(1)1 Display Widgets简介2 如何使用Display Widgets部件 Chapter3 Qt自定义控件电池组件使用前言一、最基本的使用方法二、Batt…