http://acm.pku.edu.cn/JudgeOnline/problem?id=2593最大m子段问题,此题中m=2。方法还是DP,基本上还是用我们熟悉的最大子段和的方法。
读入数据是时做一次DP,得到从前往后到第i(0=<i<n)个元素处时的最大子段和,然后再
从后往前反向做一次DP,加上前面求得的正向的最大字段和即可求出一个最大值。
Memory: 988K |
|
Time: 172MS |
Language: C |
|
Result: Accepted |
#include<stdio.h>
int main()
{
int n,num[100000],MaxSum[100000];
while(scanf("%d",&n),n){
int i,sum=0,max=-100000,ret=-0x7fffffff;
for(i=0;i<n;i++) {
scanf("%d",&num[i]);
if(sum>0) sum+=num[i];else sum=num[i];
if(sum>max) max=sum;
MaxSum[i]=max;
}
for(max=-0x7fffffff,sum=0,i=n-1;i>=1;i--){
if(sum>0) sum+=num[i];else sum=num[i];
if(sum>max) max=sum;
if(max+MaxSum[i-1]>ret) ret=max+MaxSum[i-1];
}
printf("%d\n",ret);
}
return 0;
}