最大子段和

题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87125#problem/A

题意:

        多组案例,每组案例给出给出一组字符串,找出这组字符串中连续子串的和的最大值。

       输入:首行输入案例数,每个案例先输入字符串长度,再输入字符串。案例与案例间用空行间隔。

案例:

        Sample Input     

        2

        5 6 -1 5 4 -7

        7 0 6 -1 1 -6 7 -5

        Sample Oouput

        Case 1:14 1 4

        Case 2:7 1 6

分析:

       最大子序列即找出数组中和最大的连续子序列。比如{5,-3,4,2}的最大子序列就是{5,-3,4,2},它的和是8,达到最大;而{5,-6,4,2}的最大子序列是{4,2},它的最大和是6。只要前i项的和还没有小于0则子序列就一直向后扩展,否则丢弃之前的子序列开始新的子序列,同时记下各个子序列的和,最后找到和最大的子序列。
源代码:

 1 #include<cstdio>
 2 int a[100010];
 3 int main()
 4 {
 5     int T,cnt=0;
 6     scanf("%d",&T);
 7     while(T--)
 8     {
 9         int n,count=-1000,sum=0,l=1,r,k=1;
10         scanf("%d",&n);
11         for(int i=0;i<n;i++)
12             scanf("%d",&a[i]);
13         for(int j=0;j<n;j++)//找最大子串
14         {
15             sum+=a[j];
16             if(sum>count)//当前子串延续,和继续增大
17             {
18                 count=sum;
19                 l=k;//记录子串开始位置
20                 r=j+1;//记录子串结束位置
21             }
22             if(sum<0)//当前子串和值达负值,另寻子串比较
23             {
24                 sum=0;
25                 k=j+2;
26             }
27         }
28         printf("Case %d:
%d %d %d
",++cnt,count,l,r);
29         if(T) printf("
");
30     }
31     return 0;
32 }
原文地址:https://www.cnblogs.com/huaszjh/p/4731263.html