最优化的算法复杂度为O(n),在一次遍历的过程中计算最大值。如果当前结果小于0则从当前位置的下一个重新开始计算。代码如下:
#include<cstdio>
using namespace std;
#define N 10000
int main(){
int k,begin,end,sum,max,i,max_b,max_e;
int num[N];
bool flag = false;
scanf("%d",&k);
for(i=0;i<k;i++){
scanf("%d",&num[i]);
if(num[i]>=0)
flag=true;
}
if(!flag){
printf("0 %d %d",num[0],num[k-1]);
return 0;
}
begin = end = 0;
sum = 0;
max = -9999;
max_b =max_e=0;
for(i=0;i<k;i++){
sum+=num[i];
end = i;
if(sum>max){
max = sum;
max_b = begin;
max_e = end;
}
if(sum<=0){
begin = i+1;
sum = 0;
}
}
printf("%d %d %d",max,num[max_b],num[max_e]);
return 0;
}