//与最长公共子串类似,因为有连续的要求,直接将最大序列和作为中间状态会导致dp[i]和dp[i-1]的关系难以得出,故将中间状态设为包含右边缘的最大序列和,以保证连续的要求并得出dp[i]和dp[i-1]的关系(根据dp[i-1]的正负)
//总结:放苹果,上楼梯等排列组合问题 和 最长公共子序列,最长公共子串,最大序列和等最值问题 可考虑用动态规划解决,相比与直接递归,应记录了中间状态而减低了时间复杂度,是一种空间换时间的策略
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>

using namespace std;

long long s[1000001];//s元素范围-10^9~10^9
long long dp[1000002];//店铺[i]表示 前i个元素 包含右边缘的最大序列和
int main() {
    int n;
    while (scanf("%d", & n) != EOF) {
        for(int i=0;i<n;i++){
            scanf("%lld",&s[i]);
        }

        dp[1] = s[0];//前一个最大序列和只能是第1个元素
        long long curmax = dp[1];
        for (int i = 2; i <= n; i++) {
            if (dp[i - 1] <= 0) {
                dp[i] = s[i - 1];
            } else {
                dp[i] = dp[i - 1] + s[i - 1];
            }
            curmax = max(curmax, dp[i]);
        }
        printf("%lld\n", curmax);
    }
    return 0;
}