状态
b[ j ]表示以a [ j ]结尾的最大子段和
状态转移方程
b[ j ] = max( b[j-1] + a[ j ], a[ j ] )
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <vector>
#include <string>
#include <map>
#include <set>
#include <queue>
#include <string.h>
#include <math.h>
#include <stack>
#include <ctype.h>
using namespace std;
int n;
long long a[50005];
long long dp[50005];
int main()
{
cin >> n;
for( int i = 0; i < n; i++ )
{
cin >> a[i];
dp[i] = 0;
}
for( int j = 0; j < n; j++ )
{
dp[j] = max(dp[j-1] + a[j], a[j]);
}
long long Max = 0;
for( int i = 0; i < n; i++ )
Max = max(Max, dp[i]);
printf("%lld\n", Max);
return 0;
}