对于最大子列和的问题,大家应该都很熟悉了。用DP算法能很快速简便的求出SUM的问题,但对于子列的开头和结尾,还是一个值得深究的问题。
一、不要求开头,结尾序号 ,只要求值的情况
以PTA上的测试点为例:
其实难点在于数列全为0、全为负、0与负混合的三种情况。
若全0,则输出为0 0 0;
若全为负,则输出为 0 a[0] a[n-1]
若0负混合,则输出为 0 0 0。
那么我们很自然想到,让两个结果变量left=right=0,然后设置一个标志位,当检测到全负时,则left=a[0],right=a[n-1]。
那么代码就很容易写出来了:
#include<stdio.h>
int f4(int a[],int n){
int i,max=0,now=0,l=0,r=0,flag=0;
a[10001]=0;a[10002]=0;
for(i= 0;i<n;i++){
if(a[i]>=0)
flag=1;
if(now<0){
l=i;
r=i;
now=a[i]; //刚吸收的数可能非常大,所以必须更新l与r
}
else {
r=i;
now+=a[i];
}
if(now>max){
max=now;
a[10002]=a[r];
a[10001]=a[l];
}
}
if(!flag){
a[10001]=a[0];
a[10002]=a[n-1];
}
return max;
}
int main(){
int i,n;
scanf("%d",&n);
int a[10002];
for(i=0;i<n;i++)
scanf("%d",&a[i]);
int sum=f4(a,n);
printf("%d %d %d",sum,a[10001],a[10002]);
return 0;
}