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 }