题目链接:

最优思路
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尽量大
最后找到答案