同poj2479一样,改一下就好了
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<vector>
using namespace std;
int num[100005];
long long suml[100005],sumr[100005];
int main()
{
// int t;
//scanf("%d",&t);
int n;
while(1)
{
scanf("%d",&n);
if(n==0)
break;
for(int i=0;i<n;i++)
{
scanf("%d",&num[i]);
}
long long sum1=0,sum2=0;
//最大数字连续和
for(int i=0;i<n;i++)
{
//先把运算到每个点的值存起来
sum1+=num[i];
if(sum1<0)
{
suml[i]=sum1;
sum1=0;
}
else
suml[i]=sum1;
sum2+=num[n-1-i];
if(sum2<0)
{
sumr[n-1-i]=sum2;
sum2=0;
}
else sumr[n-1-i]=sum2;
}
long long maxl=suml[0],maxr=sumr[n-1];
//找从头到这个数或者从尾到这个数的最大值进行覆盖
for(int i=0;i<n;i++)
{
if(suml[i]<maxl)
{
suml[i]=maxl;
}
else maxl=suml[i];
if(sumr[n-i-1]<maxr)
{
sumr[n-i-1]=maxr;
}
else maxr=sumr[n-1-i];
}
long long maxnn=suml[0]+sumr[n-1];
//最后求最大和值
for(int i=1;i<n-1;i++)
{
if(maxnn<suml[i]+sumr[i+1])
{
maxnn=suml[i]+sumr[i+1];
}
}
printf("%lld\n",maxnn);
}
return 0;
}