1 /*
2 http://acm.hdu.edu.cn/showproblem.php?pid=1003
3 题意:求序列中的一段数字,这段数字和最大.
4 思路:1.假设我已经求出了右端为i的最大子段和sum,现在计算右端为i+1的最大子段和,如果sum<0,
5 那么显然这个最大子段和就是第i+1个数,如果sum>=0,这个最大子段和就是sum加第i+1个数.
6 右端为1的最大字段和是第一个数,按照上面的思路计算右端为2到n的各个最大子段和,取最大即为结果
7 2.如果不用记录左右端,用可以直接dp[i]=max(dp[i-1],0)+a[i],其实都一样
8 2017年02月07日22:38:47
9 */
10 #include <cstdio>
11 int a[101000];
12 int main(){
13 int T;
14 scanf("%d",&T);
15 a[0]=0;
16 for(int tt=0;tt<T;tt++){
17 int n;
18 scanf("%d",&n);
19 for(int i=1;i<=n;i++){
20 scanf("%d",&a[i]);
21 }
22 int zz=1,yy=1,sum=a[1],maxsum=a[1],nowz=1,nowy=1;
23 for(int i=2;i<=n;i++){
24 if(sum>=0){
25 sum=sum+a[i];
26 nowy=i;
27 if(sum>maxsum){
28 maxsum=sum;
29 zz=nowz;
30 yy=nowy;
31 }
32 }else{
33 sum=a[i];
34 nowz=i;
35 nowy=i;
36 if(sum>maxsum){
37 maxsum=sum;
38 zz=nowz;
39 yy=nowy;
40 }
41 }
42 }
43 if(tt)printf("\n");
44 printf("Case %d:\n",tt+1);
45 printf("%d %d %d\n",maxsum,zz,yy);
46 }
47 return 0;
48 }