求最大连续子序列问题,有一个思路例如
-2 6 -4 7 -1 3 -9 -4 5 8
求一个序列的最大子序列时,其子序列的首一定是正数,然后加后面的数,一直加
直到出现了之和为负数,在这期间要不断比较,求前面这些数总合的最大值,那么这段序列
的最大值就可求出来。而在之和小于零时,把其重置为零,这样就可以求出最大值
max sum
0 0->-2->0
0 0->6
0->6 6->2
6 2->9
6->9 9->8
9 8->11
9->11 11->2
11 2->-2->0
11 0->5
11 5->13
13
-2 6 -4 7 -1 3 -9 -4 5 8
求一个序列的最大子序列时,其子序列的首一定是正数,然后加后面的数,一直加
直到出现了之和为负数,在这期间要不断比较,求前面这些数总合的最大值,那么这段序列
的最大值就可求出来。而在之和小于零时,把其重置为零,这样就可以求出最大值
max sum
0 0->-2->0
0 0->6
0->6 6->2
6 2->9
6->9 9->8
9 8->11
9->11 11->2
11 2->-2->0
11 0->5
11 5->13
13
这样变化之后就可以算出最大值
用now计算这个序列第一个大于0的数,然后用right记录这个序列最后的数(前提,这个序列是目前已知最大序列)
#include<stdio.h>
int z[10005];
int main(void)
{
int n;
while(scanf("%d",&n),n){
int i;
for(i=0;i<n;i++) scanf("%d",&z[i]);
int ans=z[0];
int num=0;
int left,right,now;
left=right=z[0];
for(i=0;i<n;i++){//计算最大值,并使用left right记录左值和右值
if(num<0){
num=z[i];
now=z[i];
}
else num+=z[i];
if(num>ans){
ans=num;
left=now;
right=z[i];
}
}
if(ans<0) printf("0 %d %d\n",z[0],z[n-1]);
else
printf("%d %d %d\n",ans,left,right);
}
return 0;
}