HDU 1003

 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 }

 

posted @ 2017-03-01 19:10  boom~  阅读(189)  评论(0编辑  收藏  举报