#define_CRT_SECURE_NO_WARNINGS#include<iostream>#include<vector>#include<queue>#include<algorithm>#include<utility>#include<unordered_map>usingnamespace std;constint N =1e5+10;int num;int figures[N];intmain(){while(~scanf("%d",&num)){for(int i =0; i < num; i++)scanf("%d",&figures[i]);int res =0;int left =0;int right =0;// dp:以第i个数为左端点的所有序列中的最大序列和(一定含有第i个数,也就是确定了左端点)// r:最大序列和对应序列的右端点// 状态转移方程:dp[i] = max(dp[i+1], 0) + figures[i]// 状态转移方程中,只涉及了相邻的两个dp,所以没有必要使用dps数组,记录整个过程中的数据for(int i = num -1, dp =0, r =0; i >=0; i--){// 上一次iteration计算出的dp,在本次iteration中就是dp[i+1]if(dp <=0){
dp =0;
r = i;}
dp += figures[i];// 保留最大序列和及其端点if(res <= dp){
res = dp;
left = i;
right = r;}}printf("%d %d %d\n", res, left, right);}returnNULL;}