//添加一个大小为2的数组记录起点和终点 //终点易确定,只要序列值增加,更新终点 //记录每次起点,序列值增加更新最大起点(序列值增加未必有新起点) #include<iostream> #include<cstdio> #include<queue> #include<climits> using namespace std; const int MAXN =10000; int dp[MAXN]; int ans[2]={0,0}; int arr[MAXN]; void Function(int n){ int answer =INT_MIN; int start;//每次更新的节点 int maxstart;//重点记录每次起点得到的最大序列的起点值 for(int i=0;i<n ; i++){ if(i==0){ dp[i]=arr[i]; start=0; }else{ if(arr[i]>arr[i]+dp[i-1]){ dp[i]=arr[i]; start=i;//新起点 }else{ dp[i]=dp[i-1]+arr[i]; } } if(answer <dp[i]){ answer=dp[i]; maxstart =start;//得到更大值,更新最大起点 ans[1] = arr[i]; } } cout<<answer<<" "<<arr[maxstart]<<" "<<ans[1]<<endl; return; } int main(){ int n; while(scanf("%d",&n) != EOF){ if(n==0){ break; } for(int i=0;i<n;i++){ scanf("%d",&arr[i]); } Function(n); } return 0; }