来自于洛谷的一道题,链接附上
问题定义:给出一个长度为 n 的序列 a,选出其中连续且非空的一段使得这段和最大
以以下样本为例
2 -4 3 -1 2 -4 3
当我们想求第i个位置的最大和

当我们的前缀和数组为Presum,数组以1开始我们可以将其转化为

此时我们可以把问题转化为求下方式子的最大值
presum[i]-presum[x];//1<=x<=n-1
此时我们可以遍历整个前缀和数组,减去最小的presumx,从而获得最大的max.
相关代码
cpp
#include<iostream>
using namespace std;
typedef long long LL;
const int N = 2e5 + 10;
int n;
LL f[N];
int main()
{
cin >> n;
for (int i = 1;i <= n;i++)
{
int x;cin >> x;
f[i] = f[i - 1] + x;
}
LL ret = -1e10;
LL premin = 0;
for (int i = 1;i <= n;i++)
{
ret = max(ret, f[i] - premin);
premin = min(premin, f[i]);
}
cout << ret;
return 0;
}