原题链接:http://poj.org/problem?id=2593
纪念下第一次用kmp
思路:先正向遍历数组a将以a[i]为结尾的最大和存储在m1里,再逆向遍历数组a将以a[i]为开头的最大和存储在m2里,然后再通过枚举,maxn=(maxn,(max(m1,m2)),maxn就是需要输出的答案
代码:
#include<stdio.h>
const int N=100005;
int a[N],end[N],start[N],m1[N],m2[N];
int max(int x,int y)
{
int z;
if(x>y)
z=x;
else
z=y;
return z;
}
void compete(int n)
{
int i;
m1[0]=end[0]=a[0];
for(i=1;i<n;i++)
{
end[i]=max(a[i],a[i]+end[i-1]);
m1[i]=max(m1[i-1],end[i]);
}
m2[n-1]=start[n-1]=a[n-1];
for(i=n-2;i>=0;i--)
{
start[i]=max(a[i],a[i]+start[i+1]);
m2[i]=max(m2[i+1],start[i]);
}
}
int main()
{
int i,n,maxn;
while(scanf("%d",&n),n!=0)
{
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
compute(n);
maxn=m1[0]+m2[1];
for(i=1;i<n-1;i++)
{
maxn=max(m1[i]+m2[i+1],maxn);
}
printf("%d\n",maxn);
}
return 0;
}