P1115 最大子段和

题目链接:

P1115 最大子段和 - 洛谷

最优思路

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    cin >> n;
    vector<long long> arr(n);
    vector<long long> arr2(n);  
    for (int i = 0; i < n; i++)
    {
        cin >> arr[i];
    }
    arr2[0] = arr[0];
    for (int i = 1; i < n; i++)
    {
        arr2[i] = arr2[i - 1] + arr[i];
    }
    long long m = 0;             
    long long ans = -9223372036854775808;  
    for (int i = 0; i < n; i++)
    {
        ans = max(ans, arr2[i] - m);  
        m = min(m, arr2[i]);      
    }
    cout << ans;
    return 0;
}

思路:

想要求一段区间的最大和,与和有关的优先考虑前缀和:

一段区间的和为:

l r为该区间左右下标

suml,r = sum0,l - sum0,r-1;

想要suml,r最大

sum0,l尽量大

sum0,r-1尽量小;

于是就遍历一下前缀和数组:

其中设置一个m来存历史(之前的)的最小前缀和:这样就实现了 sum0,r-1尽量小的目的

cpp 复制代码
       m = min(m, arr2[i]);      

然后再设一个ans

ans初始化为了 -9223372036854775808,也就是long long类型的人最小数字,

也可以用LLONG_MIN代替

因为数组里的数可以是小于0的,如果初始化为0就照顾不到负数了

再与历史值和当前最大段和比较

在遍历的过程的也实现sum0,l尽量大

最后找到答案

相关推荐
吴长建先生重名了1 分钟前
电商订单系统在Docker和Kubernetes中部署的高
算法
雷✘30 分钟前
C++ 类与对象的初始化机制、成员访问边界与拷贝优化
java·网络·c++
努力实干1 小时前
简单工厂模式(Simple Factory Pattern)——C++
开发语言·c++·简单工厂模式
東隅已逝,桑榆非晚2 小时前
算法2. 双指针法-复写零
c++·笔记·学习·算法
布莱克6052 小时前
C++ 中堆和栈的区别详解
开发语言·c++·栈·堆
云析赢指标公式网43 小时前
文华财经指标源码笔记:WINNER筹码函数、控盘变量与MACD变体的调试记录
java·笔记·算法
誰能久伴不乏3 小时前
用 UDP 做一条“可靠“的控制通道
c++·qt·网络协议·udp
十五年专注C++开发3 小时前
FlatBuffers: 一个高效的零拷贝二进制序列化库
c++·序列化·反序列化·flatbuffers
xys_6784 小时前
深挖C++:C++入门基础
开发语言·c++
高冷小鱼殿下4 小时前
C 语言指针与输入输出
c++