题目链接: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 }