选取状态:以某点i为结尾的最大子序列和
另外多存储一个起始下标
#include <cstdio>
struct node{
int s, max_sum; //以i为尾,最大和子序列的开始下标与最大和
};
int main(){
int K;
scanf("%d", &K);
int seq[K];
bool negative = true;
for(int i=0; i<K; i++){
scanf("%d", &seq[i]);
if(seq[i]>=0) negative = false;
}
if(negative){
printf("0 %d %d", seq[0], seq[K-1]);
return 0;
}
node ans[K];
//边界
ans[0].s = 0;
ans[0].max_sum = seq[0];
for(int i=1; i<K; i++){ //处理顺序为从左到右
//状态转移方程
if(ans[i-1].max_sum+seq[i]>seq[i]){
ans[i].s = ans[i-1].s;
ans[i].max_sum = ans[i-1].max_sum + seq[i];
}
else{
ans[i].s = i;
ans[i].max_sum = seq[i];
}
}
int m=0;
for(int i=1; i<K; i++){
if(ans[i].max_sum>ans[m].max_sum) m = i;
}
printf("%d %d %d", ans[m].max_sum, seq[ans[m].s], seq[m]);
return 0;
}