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

news/2024/12/1 5:44:45/

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

  • 一、问题
  • 二、分析
  • 三、代码

一、问题

在这里插入图片描述

二、分析

涉及到一段区间和的问题,我们最容易想到的是前缀和算法。

因此,我们可以假设我们的最优解区间是[l,r][l,r][l,r],同时将前缀和数组记作s[i]s[i]s[i],那么我们的区间和就可以表示为s[r]−s[l−1]s[r]-s[l-1]s[r]s[l1],假设我们固定一右端点rrr,那么如果想要让这个差值最大,在s[r]s[r]s[r]不变的情况下,只能是s[l−1]s[l-1]s[l1]最小。

也就是说,我们需要在rrr的右侧寻找一个最小值,但是这个最小值的所在范围是有一定约束的,因为题目中说的是区间长度不超过mmm,所以我们需要在rrr右侧m+1m+1m+1的范围内找一个最小值。

为什么是m+1m+1m+1?

因为我们想要找[l,r][l,r][l,r]的区间和,用到的是s[l−1]s[l-1]s[l1],也就是说如果区间长度是mmm,我们减去的是左侧距离m+1m+1m+1的那个数。

而随着右端点的移动,这个长度为mmm的范围也在向右移动,相当于一个滑动窗口。

而对于滑动窗口求最值的方法就是我们在之前介绍过的单调队列

如果读者对单调队列不熟悉的话,作者在算法专栏中写过一篇文章:第九章:单调栈与单调队列,这里面详细地介绍了该算法和一些关键点的讨论。

这里就直接用单调队列了。

因此,我们只需要枚举右端点,一边枚举右端点一边更新滑动窗口。

这道题其实和DP没有太大的关系。

只不过我们的右端点rrr是从小到大枚举的,类似于DP从小到大求解问题的思想。

但状态和状态之间没有必然的联系。

三、代码

#include<bits/stdc++.h>
using namespace std;
const int N = 3e5 + 10;
int a[N], s[N];
int q[N], h, t;
void solve()
{int n, m;cin >> n >> m;for(int i = 1; i <= n; i ++ ){scanf("%d", a + i);a[i] += a[i - 1];}int res = -0x3f3f3f3f;for(int i = 1; i <= n; i ++ ){if(h <= t && q[h] < i - m )h++;res = max(res, a[i] - a[q[h]]);while(h <= t && a[q[t]] >= a[i])t--;q[ ++ t] = i;}cout << res << endl;
}int main()
{solve();return 0;
}

http://www.ppmy.cn/news/22451.html

相关文章

profiles.active多环境开发、测试、部署

1、使用场景 在开始讲profiles.active配置时&#xff0c;我们先来考虑几个场景。 我们在开发过程中&#xff0c;经常会碰到多个环境&#xff0c;特别熟数据库&#xff0c;经常是有开发库&#xff0c;测试库&#xff0c;和生产库。一般我们都是连的开发库进行开发&#xff0c;…

Class文件结构

Class文件结构 1.Java代码可以跨平台运行的基础就是因为jvm的跨语言特性&#xff0c;无论哪种语言编写的程序&#xff0c;只要能编译成class文件&#xff0c;就能通过Jvm在各种平台上运行。实现这一特性的关键就是同意而强大的Class文件结构&#xff0c;它是异构语言与jvm之间…

Tomcat 基础

目录 一&#xff1a;web 概念 1.软件架构 2.资源分类 3.网络通信三要素 二&#xff1a;常见的web服务器 1 .概念 2.常见web服务器软件 三&#xff1a;Tomcat 历史 四&#xff1a;Tomcat 安装 1.下载 2. 安装 四&#xff1a;Tomcat 目录结构 五&#xff1a;Tomcat …

Vue使用v-viewer插件实现图片预览和缩放和旋转等功能

前言 昨天不是做了一个动态的图片展示吗&#xff0c;今天就寻思着能不能完善下功能&#xff0c;可以通过点击图片的方式进行放大缩小&#xff0c;甚至旋转。 图片展示可以参考&#xff1a;Vue显示图片的几种方式 然后我一顿收搜&#xff0c;发现了vue中有这么一款插件&…

46 理论计算机科学基础-北京大学

P10 课程介绍05:46P21-1 预备知识07:43P31-2 确定型有穷自动机例子11:23P41-3 确定型有穷自动机的形式化定义17:51P51-4 设计确定型有穷自动机05:57P61-5 正则运算与封闭性28:16P71-6 非确定型有穷自动机37:43P81-7 DFA与NFA的等价性17:41P91-8 正则语言的封闭性10:30P102-1 正…

Vue3 + vite + Ts + pinia + 实战 + 源码 +electron(2)

十二、异步组件&代码分包&suspense 顶层axios&#xff1a;在setup中&#xff0c;可以不需要使用async&#xff0c;它会自动编译成这个 <script setup lang"ts"> import axios from axiosconst {data:{data}} await axios({url:"http://localho…

Linux嵌入式开发——C编程

文章目录Linux嵌入式开发——C编程一、编写C程序1.1、设置vim编辑器1.2、编写C程序二、编译C程序三、make工具和Makefile文件3.1、编写C程序C文件H文件3.2、不使用make工具3.3、使用make工具和Makefile文件编译Linux嵌入式开发——C编程 一、编写C程序 我们目前就是使用VIM编…

Webug4.0靶场通关

14.Webug4.0靶场通关 显错注入 首先整体浏览网站 注入点&#xff1a; control/sqlinject/manifest_error.php?id1 判断注入类型 输入: and 11 正常, 再输入: and 12 还正常, 排除数字型 输入单引号: ’ 网页发生变化 输入’ – q注释掉单引号,页面回显正常 则为字符型 判…