最大子段和
//#include<iostream>
//using namespace std;
//int sum=0;
//int submid(int n,int x[100])
//{
// int ttti,tttj;
// for(int i=0;i<n;i++)
// {
// int ttt=0;
// for(int j=i;j<n;j++)
// {
// ttt+=x[j];
// if(ttt>sum)
// {
// sum=ttt;
// ttti=i;tttj=j;
// }
// }
// }
// return sum;
//}
//int main()
//{
// int n;
// int x[100];
// while(cin>>n)
// {
// for(int i=0;i<n;i++)
// {
// cin>>x[i];
// }
// cout<<submid(n,x)<<endl;
// }
//
//}
#include<iostream>
using namespace std;
int maxsubsum(int *x,int left,int right)
{
int sum=0;
if(left==right)
{
sum=x[left]>0?x[left]:0;
}
else
{
int centre=(left+right)/2;
int leftsum=maxsubsum(x,left,centre);
int rightsum=maxsubsum(x,centre+1,right);
int s1=0;
int lefts=0;
for(int i=centre;i>=left;i--)
{
lefts+=x[i];
if(lefts>s1)
s1=lefts;
}
int s2=0;
int rights=0;
for(int i=centre+1;i<=right;i++)
{
rights+=x[i];
if(rights>s2)
s2=rights;
}
sum=s1+s2;
if(sum<leftsum)sum=leftsum;
if(sum<rightsum)sum=rightsum;
}
return sum;
}
int maxsum(int n,int *x)
{
return maxsubsum(x,1,n);
}
int main()
{
int n;
int x[100];
while(cin>>n)
{
for(int i=1;i<=n;i++)
{
cin>>x[i];
}
cout<<maxsum(n,x)<<endl;
}
}
//最大子段和动态规划
//#include<iostream>
//using namespace std;
//int maxsum(int n,int *x)
//{
// int sum=0,b=0;
// for(int i=1;i<=n;i++)
// {
// if(b>0)b+=x[i];
// else b=x[i];
// if(b>sum)sum=b;
// }
// return sum;
//}
//int main()
//{
// int n;
// int x[100];
// while(cin>>n)
// {
// for(int i=1;i<=n;i++)
// {
// cin>>x[i];
// }
// cout<<maxsum(n,x)<<endl;
// }
//}
//#include<iostream>
//using namespace std;
//int sum=0;
//int submid(int n,int x[100])
//{
// int ttti,tttj;
// for(int i=0;i<n;i++)
// {
// int ttt=0;
// for(int j=i;j<n;j++)
// {
// ttt+=x[j];
// if(ttt>sum)
// {
// sum=ttt;
// ttti=i;tttj=j;
// }
// }
// }
// return sum;
//}
//int main()
//{
// int n;
// int x[100];
// while(cin>>n)
// {
// for(int i=0;i<n;i++)
// {
// cin>>x[i];
// }
// cout<<submid(n,x)<<endl;
// }
//
//}
#include<iostream>
using namespace std;
int maxsubsum(int *x,int left,int right)
{
int sum=0;
if(left==right)
{
sum=x[left]>0?x[left]:0;
}
else
{
int centre=(left+right)/2;
int leftsum=maxsubsum(x,left,centre);
int rightsum=maxsubsum(x,centre+1,right);
int s1=0;
int lefts=0;
for(int i=centre;i>=left;i--)
{
lefts+=x[i];
if(lefts>s1)
s1=lefts;
}
int s2=0;
int rights=0;
for(int i=centre+1;i<=right;i++)
{
rights+=x[i];
if(rights>s2)
s2=rights;
}
sum=s1+s2;
if(sum<leftsum)sum=leftsum;
if(sum<rightsum)sum=rightsum;
}
return sum;
}
int maxsum(int n,int *x)
{
return maxsubsum(x,1,n);
}
int main()
{
int n;
int x[100];
while(cin>>n)
{
for(int i=1;i<=n;i++)
{
cin>>x[i];
}
cout<<maxsum(n,x)<<endl;
}
}
//最大子段和动态规划
//#include<iostream>
//using namespace std;
//int maxsum(int n,int *x)
//{
// int sum=0,b=0;
// for(int i=1;i<=n;i++)
// {
// if(b>0)b+=x[i];
// else b=x[i];
// if(b>sum)sum=b;
// }
// return sum;
//}
//int main()
//{
// int n;
// int x[100];
// while(cin>>n)
// {
// for(int i=1;i<=n;i++)
// {
// cin>>x[i];
// }
// cout<<maxsum(n,x)<<endl;
// }
//}