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 小时前
华为题:零钱兑换
算法·华为
wuminyu1 小时前
ZGC染色指针在虚拟线程stackChunkOop上的并发屏障全景分析
java·linux·c语言·jvm·c++
Logic1011 小时前
C语言/数据结构组合数学题解:数字好排列计数——质数倍数分类与阶乘取模
c语言·数据结构·算法·组合数学·时间复杂度·排列·取模运算
碧海银沙音频科技研究院2 小时前
炬芯ATS3089智能手表烧录方法
人工智能·驱动开发·嵌入式硬件·算法
INGNIGHT2 小时前
486. 预测赢家(博弈dp/区间dp)
linux·c++
维克兜率天2 小时前
【维克】统计套利:寻找市场的“定价误差“
人工智能·python·算法
aqiu1111112 小时前
【C++算法打怪专栏】LeetCode 1. 两数之和(哈希表解法总结)
c++·算法·leetcode
楚识科技2 小时前
票据 OCR 识别技术深度解析:从算法原理到企业级落地实现
算法·ocr
longlongzihan2 小时前
LeetCode 25. K 个一组翻转链表 (迭代+分组反转法)
算法·leetcode·链表