题目:http://poj.org/problem?id=2593
大意:给你一个数列,求数列中两个不重叠的子序列的最大和。
从左向右求得left[]数组,left[i]表示0~i之间的最大连续子序列。
再从右往做左求最大子序列,然后求0~i,i+1~n-1的两段子序列中的最大和。
代码:
View Code
#include<stdio.h>
int a[100010],left[100010];
int main()
{
int max,i,n,sum,temp;
while(scanf("%d",&n)!=EOF&&n!=0)
{
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
sum=0;
max=-999999999;
for(i=0;i<n;i++)
{
sum+=a[i];
if(sum>max)
max=sum;
left[i]=max;
if(sum<0)
sum=0;
}
sum=0;
max=-999999999;
temp=-999999999;
for(i=n-1;i>=1;i--)
{
sum+=a[i];
if(sum>max)
max=sum;
if(temp<max+left[i-1])
temp=max+left[i-1];
if(sum<0)
sum=0;
}
printf("%d\n",temp);
}
return 0;
}