首页 > 其他分享 >单调队列与最大子序和问题

单调队列与最大子序和问题

时间:2023-09-20 17:47:32浏览次数:42  
标签:10 le 队列 max int ch cdot 子序 单调

HDU - 1003 - Max Sum

题意:给定一个长度为 $ n $ 的序列 $ a_1, a_2, a_3, \cdot\cdot\cdot a_n (-10^3 \le a_i \le 10^3, 1 \le n \le 10^5) $, 找出其中一个和最大的连续子段, 并输出最大的和、该子段的起始下标。

思路一:DP
设 $ f_i $ : 以 $ a_i $ 结尾的最大子序和。因为需要选择连续的子段, 因此, $ f_i = max(f_i - 1 + a_i, a_i) $。

点击查看代码
#include <bits/stdc++.h>

inline int read() {
    int res = 0; char ch = getchar(); bool sym = false;
    while (!isdigit(ch)) sym |= (ch == '-'), ch = getchar();
    while (isdigit(ch)) res = (res << 3) + (res << 1) + (ch ^ 48), ch = getchar();
    return sym ? -res : res;
}

int main() {
    int T = read();
    for (int i = 1; i <= T; i++) {
        int n = read();
        std::vector<int> f(n + 1);
        std::vector<int> a(n + 1);
        for (int j = 1; j <= n; j++) {
            a[j] = read();
        }
        for (int j = 1; j <= n; j++) {
            f[j] = a[j];
        }
        int max = (int) -2e9;
        int l = 1, r = 1, p = 1;
        for (int j = 1; j <= n; j++) {
            if (f[j - 1] >= 0) {
                f[j] += f[j - 1];
            } else {
                p = j;
		// 下一个可能的子段的左端点是 j
            }
            if (f[j] > max) {
                max = f[j]; l = p; r = j;
            }
        }
        printf("Case %d:\n%d %d %d\n", i, max, l, r);
    }
    return 0;
}

接下来考虑:如果限制子段的长度 $ \le k $, 该问题应如何解决。

标签:10,le,队列,max,int,ch,cdot,子序,单调
From: https://www.cnblogs.com/LDUyanhy/p/17717927.html

相关文章

  • MQ - 01 消息队列发展史&MQ通用架构
    @[toc]导图PreMQ-闲聊MQ一二事儿(Kafka、RocketMQ、Pulsar)MQ发展史基于JMS协议发展出来的ActiveMQ因为功能和稳定性问题,用的人比较少。AMQP是一个消息队列协议规范,它不是一款具体的消息队列。因为不同消息队列的访问协议是不一样的,导致不同的消息队列需要用不同的SDK访......
  • 21_消息队列
    消息队列消息队列1、任务级队列处理函数2、中断级队列处理函数(带中断保护)已经在CMSIS接口中封装但写入生产速度比消费速度快的时候,容易出现数据被覆盖邮箱队列创建、发送、接收、查询、删除传数值osEventevent=osMessageGet(myQueue01Handle,osWaitForever);......
  • Spring Boot + Disruptor 实现消息队列,告诉你什么叫快、什么叫高效!
    01、背景工作中遇到项目使用Disruptor做消息队列,对你没看错,不是Kafka,也不是rabbitmq;Disruptor有个最大的优点就是快,还有一点它是开源的哦,下面做个简单的记录.02、Disruptor介绍Disruptor是英国外汇交易公司LMAX开发的一个高性能队列,研发的初衷是解决内存队列的延迟问题......
  • 消息队列 - RabbitMQ
    RabbitMQ简介RabbitMQ是一个广泛使用的开源消息队列系统,它实现了高级消息队列协议(AMQP)标准,为分布式应用程序提供了强大的消息传递功能。RabbitMQ是Erlang语言编写的,具有高度的可扩展性和可靠性,因此被广泛用于构建分布式、异步的消息通信系统。以下是关于RabbitMQ的详细介......
  • 深入研究消息队列07 架构升级
    36云原生:业界MQ的计算存储分离存算分离架构存算一体架构如下存算分离架构则是目前实现弹性消息队列集群的主要技术方案存算分离架构的优点是计算层为无状态,因此计算层的扩缩容就很方便。缺点是架构变复杂,代码实现难度也提升很多,日常的运维、研发的学习成本也会相应提高。另外计算......
  • ## day13 - 栈与队列part03
    day13-栈与队列part03力扣239.滑动窗口的最大值思路:利用单调队列,很难想的出来。因为每次是进一个数,弹出一个数,因此没必要每次都进行排序,只需要拿到最大值即可。用单调队列实现,是一个双向队列pop()函数:如果要pop的值是队列头部的值,那么就弹出,否则不操作。push()函数:如果......
  • ## day11 - 栈与队列part02
    day11-栈与队列part02力扣20.有效的括号思路:利用栈的特性,遇见左括号就把右括号压栈,遇见右括号,就对比和栈顶元素是否相同,不同就返回false。代码classSolution{public:stack<int>st;boolisValid(strings){if(s.size()%2!=0){......
  • 代码随想录算法训练营-贪心算法-4|406. 根据身高重建队列、452. 用最少数量的箭引爆
    406. 根据身高重建队列1. 一定要想如何确定一个维度,然后再按照另一个维度重新排列。2.先确定身高的维度,降序排列。3. 按照身高排序之后,优先按身高高的people的k来插入,后序插入节点也不会影响前面已经插入的节点,最终按照k的规则完成了队列。4. 局部最优:优先按身高高的peop......
  • 算法训练day11 栈与队列 02 LeetCode20
    算法训练day11栈与队列02LeetCode20.1047.15020.有效的括号:题目:20.有效的括号-力扣(LeetCode)题解:代码随想录(programmercarl.com)classSolution{public:boolisValid(strings){stack<char>str;if(s.size()%2==1)......
  • [剑指offer] 队列&栈篇
    JZ9 用两个栈实现队列1/*模拟入队*/2publicclassJZ9_13{4publicstaticStack<Integer>stack1=newStack<Integer>();5publicstaticStack<Integer>stack2=newStack<Integer>();67publicstaticvoidpush(intnod......