//// 1077最大序列和.cpp : 定义控制台应用程序的入口点。
//题目1077:最大序列和
//时间限制:1 秒内存限制:32 兆特殊判题:否提交:6283解决:1875
//题目描述:
//给出一个整数序列S,其中有N个数,定义其中一个非空连续子序列T中所有数的和为T的“序列和”。
//对于S的所有非空连续子序列T,求最大的序列和。
//变量条件:N为正整数,N≤1000000,结果序列和在范围(-2^63,2^63-1)以内。
//
//输入:
//第一行为一个正整数N,第二行为N个整数,表示序列中的数。
//输出:
//输入可能包括多组数据,对于每一组输入数据,
//仅输出一个数,表示最大序列和。
//样例输入:
//5
//1 5 -3 2 4
//
//6
//1 -2 3 4 -10 6
//
//4
//-3 -1 -2 -5
//样例输出:
//9
//7
//-1
//来源:
//2006年清华大学计算机研究生机试真题
#include "stdafx.h"
#include "iostream"
#include "stdio.h"
#include "algorithm"
#include "limits.h"
using namespace std;
#define MAX(x,y) x>y?x:y
int main()
{
int n;
while(~scanf("%d",&n)){
long long x;
long long max_sum = LONG_MIN;
long long sub_sum = 0;
for(int k = 0;k<n;k++){
cin>>x;
sub_sum = MAX(sub_sum+x,x); //实际上是判断原来的 包含上一个数 的最大子串和是不是大于0
max_sum = MAX(max_sum,sub_sum);
}
cout<<max_sum<<endl;
}
return 0;
}
/*
1.由于N比较大,所以定义数组来存储的话太占内存,直接读入一个处理一个
2.LONG_MIN的头文件"limits.h"
3.x若定义为int而不是long long则 WA
*/
//#define MAX 100010
//int a[MAX];
//int dp[MAX];
//
//int main()
//{
// int n;
// while(~scanf("%d",&n)){
//
// for(int k = 0;k<n;k++)
// cin>>a[k];
// int max_sum = a[0];
// dp[0] = a[0];
// for(int i = 1; i<n; i++){
// dp[i] = max(dp[i-1]+a[i],a[i]);
// max_sum = max(max_sum,dp[i]);
// }
// cout<<max_sum<<endl;
// }
// return 0;
//}