思路:dp
提交情况:这里全部都是负数时输出的是整个序列的首尾元素
#define LOCAL
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <stack>
#define FOR(i, x, y) for(int i = x; i <= y; i++)
#define rFOR(i, x, y) for(int i = x; i >= y; i--)
#define MAX 220
#define oo 0x3f3f3f3f
using namespace std;
int dp[10010];
int a[10010];
int first[10010];
int main()
{
#ifdef LOCAL
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
#endif // LOCAL
int n;
cin>>n;
FOR(i,0,n-1)
{
cin>>a[i];
}
dp[0]=a[0];
FOR(i,1,n-1)
{
dp[i]=max(dp[i-1]+a[i],a[i]);
if(dp[i]==a[i])first[i]=i;
else{
first[i]=first[i-1];
}
}
int k=0;
FOR(i,0,n-1)
{
if(dp[i]>dp[k])k=i;
else if(dp[i]==dp[k]){
if(first[i]<first[k])k=i;
}
}
int bg=first[k];
if(dp[k]<0) printf("0 %d %d",a[0],a[n-1]);
else
printf("%d %d %d",dp[k],a[bg],a[k]);
return 0;
}