子串和 nyoj 44

来源:互联网 发布:义乌招淘宝美工 编辑:程序博客网 时间:2024/05/16 03:06

子串和

时间限制:5000 ms  |  内存限制:65535 KB
难度:3
描述
给定一整型数列{a1,a2...,an},找出连续非空子串{ax,ax+1,...,ay},使得该子序列的和最大,其中,1<=x<=y<=n。
输入
第一行是一个整数N(N<=10)表示测试数据的组数)
每组测试数据的第一行是一个整数n表示序列中共有n个整数,随后的一行里有n个整数I(-100=<I<=100),表示数列中的所有元素。(0<n<=1000000)
输出
对于每组测试数据输出和最大的连续子串的和。
样例输入
151 2 -1 3 -2
样例输出
5
提示
      // 算法:把每次的数都用 b 记下来,找到其中最大的输出,用sum 记录其中的最大值。
 /* 例如: 1, 2,-1,3,-2;
           第一次  b = 1 , sum = 1;
           第二次  b = 3 ,sum = 3;
           第三次  b = 2 ,sum = 3;
           第四次  b = 5 ,sum = 5;
           第五次  b = 3 ,sum = 5;   */
01.#include<stdio.h>
02.#include<string.h>
03.#define Max 1000001
04.inta[Max];
05.inti,j;
06.longsum,b;
07.intmain()
08.{
09.intn;
10.scanf("%d",&n);
11.while(n--)
12.{
13.longm;
14.sum=-100;
15.b=0;
16.scanf("%ld",&m);
17.memset(a,0,sizeof(a));
18.for(i=0;i<m;i++)
19.{
20.scanf("%ld",&a[i]);
21.}  
22.for(j=0;j<m;j++)
23.{
24.if(b>0)
25.{
26.b+=a[j];
27.}
28.else
29.{
30.b=a[j];       //把输入的第一个数给b
31.}
32.if(b>sum)
33.{
34.sum=b;
35.}
36. 
37.}  
38.printf("%ld\n",sum);
39.}
40.return0;
41.}


0 0