-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;
}