简单DP
思路:统计以s[i]结尾的最大子序列和ans[i],多递推一个起始下标即可
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=10001;
long long s[maxn];//序列
long long ans[maxn];//以s[i]结尾的最大子序列和
void maxsequence(int n){
long long maxans=-1;//最大子序列和
int index;//最大子序列的结束下标
int first[n];//最大子序列的起始下标
for(int i=0;i<n;i++){
if(i==0) {
ans[i]=s[i];//起始
first[i]=i;
}
else{
if(s[i]+ans[i-1]>=s[i]){
ans[i]=s[i]+ans[i-1];
first[i]=first[i-1];
}
else {
ans[i]=s[i];
first[i]=i;
}
}//递推
if(ans[i]>maxans){
maxans=ans[i];
index=i;
};//更新最大子序列和、结束下标
}
if(maxans==-1){//都是负数
maxans=0;
index=n-1;
first[index]=0;
}
printf("%d %d %d\n",maxans,s[first[index]],s[index]);
}
int main(){
int n;
while(scanf("%d",&n)!=EOF){
if(n==0)break;
for(int i=0;i<n;i++)scanf("%lld",&s[i]);
maxsequence(n);
}
return 0;
}