状态表示:f [ i ] 表示以第 i 个数结尾的每个子段的各自的和 的最大值
这个状态转换方程比较容易,就是在向后遍历的过程中判断加上这个数是否会比上个子段更大就行了
状态计算:f [ i ] = max ( f [ i ] , f [ i - 1 ] + a [ i ] )
#include <bits/stdc++.h>
using namespace std;
int a[200050];
int f[200050];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
//f[i]=max(f[i],f[i-1]+a[i])
f[1]=a[1];
for(int i=2;i<=n;i++)
f[i]=max(a[i],f[i-1]+a[i]);
int k=1;
for(int i=2;i<=n;i++)
if(f[k]<f[i])k=i;
cout<<f[k];
return 0;
}