/*求最大字段和,d[i]表示已 i 结尾(字段和中包含 i )在 a[1..i] 上的最大和,d[i]=(d[i-1]+a[i]>a[i])?d[i-1]+a[i]:a[i];max = {d[i],1<=i<=n} ;至于起点和终点,要各定义一个变量去跟踪,尤其是起点*/
#include"iostream"
#include"stdio.h"#include"algorithm"#include"string.h"#include"ctype.h"#include"cmath"#define mx 100005#define inf -32766using namespace std;int dp[mx];int a[mx];int n;int main(){ int t,i; cin>>t; int count1=0; while(t--) { count1++; cin>>n; for(i=0;i<n;i++) cin>>a[i]; int cur=0,sx=0,ey=0,mxsub=dp[0]=a[0]; for(i=1;i<n;i++) { if(dp[i-1]+a[i]>=a[i])//因为题目要求的是若有多个解,取第一个,故这里要加上等号 { dp[i]=dp[i-1]+a[i]; } else { dp[i]=a[i]; cur=i;//记录起点的变化,当最大子序列的和改变时,起点有可能随着改变 } if(dp[i]>mxsub) { mxsub=dp[i]; ey=i; sx=cur; } } cout<<"Case "<<count1<<":"<<endl; cout<<mxsub<<' '<<sx+1<<' '<<ey+1<<endl; if(t) cout<<endl;//题中用的是between,所以最后一个输出后面没有空行 } return 0;}