状态转移方程:m = m > 0 ? m + num[i] : num[i] ; 第一个m是前i个数的和,后面的两个m是前(i-1)个是的和;如果i前面的和是小于0的,那么加上第i个数肯定比i要小,所以只取第i个数即num[i],如果是大于0的,则就加上。
#include<stdio.h>
#include<string.h>
int main(){
int num[10010];
int n,m,i,j;
int sum,min,max;
while(scanf("%d",&n),n){
memset(num,0,sizeof(num));
for(i=0;i<n;i++){
scanf("%d",&num[i]);
}
min=0,max=n-1;
sum=-1;m=0;
for(j=i=0;i<n;i++){
m+=num[i];
if(sum<m){
sum=m;
min=j;
max=i;
}
if(m<0){
m=0;
j=i+1;
}
}
if(sum<0){
sum=0;
}
printf("%d %d %d\n",sum,num[min],num[max]);
}
return 0;
}