题目链接:
题意:
多组案例,每组案例给出给出一组字符串,找出这组字符串中连续子串的和的最大值。
输入:首行输入案例数,每个案例先输入字符串长度,再输入字符串。案例与案例间用空行间隔。
案例:
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 #include2 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 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:\n%d %d %d\n",++cnt,count,l,r);29 if(T) printf("\n");30 }31 return 0;32 }