https://www.luogu.com.cn/problem/P1115
b[i]为以a[i]为结尾的子段中的最大子段和
-
非空子段: b[i]=max(a[i],b[i-1]+a[i]);
-
可以为空的子段: b[i]=max(0,a[i],b[i-1]+a[i]);
因为b[i-1]>=0,所以b[i-1]+a[i]>=a[i]
即: b[i]=max(0,b[i-1]+a[i]);
#include<bits/stdc++.h>
using namespace std;
int a[1000000],b[1000000];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n;i++) b[i]=max(a[i],b[i-1]+a[i]);
int maxn=b[1];
for(int i=1;i<=n;i++) maxn=max(maxn,b[i]);
cout<<maxn;
return 0;
}```