这个问题的本质在于seq[i] 的状态由seq[i-1]正负决定(seq[i] 为以i结尾的最大子序列)
/*
* max_subseq_sum.cpp
*
* Created on: Jan 26, 2020
* Author:
*/
#include <cstdio>
int max (int &a, int &b) {
if (a>=b) return a;
else return b;
}
int main () {
int seq_num;
scanf("%d",&seq_num);
int *seq = new int [seq_num];
for (int i = 0; i<seq_num;i++){
scanf("%d",&seq[i]);
}
int *subseq_sum = new int [seq_num];
int *subseq_head = new int [seq_num];
subseq_sum [0] = seq[0];
subseq_head [0] = 0;
int max_sum = seq[0];
int max_head = 0;
int max_tail = 0;
for (int i = 1; i <seq_num;i++) {
if(subseq_sum[i-1]>=0) {
subseq_sum [i] = subseq_sum [i-1]+seq [i];
subseq_head[i] = subseq_head[i-1];
} else {
subseq_sum [i] = seq[i];
subseq_head[i] = i;
}
// U can also use this
//subseq_sum [i]= max(subseq_sum [i-1]+seq[i],seq[i] );
if(subseq_sum [i]>max_sum) {
if(subseq_sum[i-1]>=0) {
max_head = subseq_head[i-1];
max_tail = i;
} else {
max_head = i;
max_tail = i;
}
max_sum = subseq_sum[i];
}
};
printf ("%d %d %d",max_sum,max_head,max_tail);
delete [] seq;
delete [] subseq_sum;
delete [] subseq_head;
};