/*
再给顶的n个数的数组中选出连续的若干个数,使得他们的和是最大的,即最大连续自序列和.
列如.
序列. 1 -2 3 -1 6 -5 9
结果 当取子序列 3,-1,6,-5,9 结果12
我的思路.
1.最大连续子序列的开头是在1...n之中.的最大连续和
2.求出以i,开头的最大连续和,此时开头已经确定了,那麽通过枚举结尾j[i,j]之间记录最大连续的i->j的和max[i]
3.在所有以i开头的连续最大和中求出最大的一个即可.
*/
#include <stdio.h>
#define maxn 100
int get_max(int a,int b){
return a>b?a:b;
}
int main(){
int max[maxn]={0},A[maxn];
int i,n;
for(scanf("%d",&n),i=1;i<=n;i++) scanf("%d",&A[i]);
for(i=1;i<=n;i++){
int sum=0,j;
for(j=i;j<=n;j++){
sum+=A[j];
max[i]=get_max(max[i],sum);
}
}
for(i=1;i<=n;i++) n=get_max(n,max[i]);
printf("%d \n",n);
return 0;
}
/*
*
*问题:给出n个数子,求出其中连续的最大和从i,j 的和是 a[i]+a[i+1]+.......a[j]
*
*这是经典的动态规划题目
*问题:是求n个数字的其中的连续n个最大数的和.
*最大连续的数字和的结尾一定是1...n中的一个.
*因此我们只需要求出这样的d[i](以a[i]为结尾的最大连续和),d[i]的的出现可能是
*1.d[i-1]+a[i],(将a[i],放到i-1为结尾的位置,的后面).
*2.以a[i]开头,且以a[i],结尾
*我们要在上面两者求出一个较大的.做为以a[i]为结尾最大的连续子序列之和(在这里a[],序列的子序列包含本身)
*将以任意元素作为结尾的连续子序列何求出来后,在其中选出一个最大的.
*序列的开头为什么不用判断呢,这是因为隐含到了d[i]中(即在得到d[i]是已经作出了选择即为上述的1,2过程)
*/
#include <stdio.h>
#define maxn 1001
int main(){
int A[maxn]={0};
int d[maxn]={0},i,n,max=-0xffffff;
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%d",&A[i]);
d[i]=A[i];
if(i>1) d[i]=d[i]>d[i-1]+d[i]?d[i]:d[i-1]+d[i];
if(max<d[i]) max=d[i];
}
printf("%d\n",max);
return 0;
}