子串和
时间限制:
5000 ms | 内存限制:
65535 KB
难度:
3
- 描述
-
给定一整型数列{a
1,a
2...,a
n},找出连续非空子串{a
x,a
x+1,...,a
y},使得该子序列的和最大,其中,1<=x<=y<=n。
- 输入
-
第一行是一个整数N(N<=10)表示测试数据的组数)
每组测试数据的第一行是一个整数n表示序列中共有n个整数,随后的一行里有n个整数I(-100=<I<=100),表示数列中的所有元素。(0<n<=1000000) - 输出
- 对于每组测试数据输出和最大的连续子串的和。
- 样例输入
-
1 5 1 2 -1 3 -2
- 样例输出
-
5
- 提示
-
输入数据很多,推荐使用scanf进行输入
/*肯定是连续子序列和,否则只需把整数相加即可*/ #include<stdio.h> #include<stdlib.h> #include<string.h> int a[1000001]; /*int cmp(const void *a,const void *b) { return *(int *)a-*(int *)b; }*/ int subsequencesum(int a[],int n) { int sum=0,maxsum=0,i; for(i=0;i<n;i++) { sum+=a[i]; if(sum>maxsum) maxsum=sum; else if(sum<0) sum=0; } return maxsum; } int main() { int i,T;int num,max=-101; scanf("%d",&T); while(T--) { scanf("%d",&num); //memset(a,0,sizeof(a)); for(i=0;i<num;i++) { scanf("%d",a+i); if(a[i]>max)/*用qsort函数会浪费大量时间,而且wa啦*/ max=a[i]; } //qsort(a,num,sizeof(int),cmp);/*全是负数的情况要特殊考虑*/ printf("%d\n",max<=0?max:subsequencesum(a,num)); } return 0; } //TLE,十个数就40s #include<stdio.h> #include<string.h> //#include<time.h> int a[1000001]; int subsequencesum(int a[],int n) { int sum,maxsum=0,i,j,k; for(i=0;i<n;i++) for(j=i;j<n;j++) { sum=0; for(k=i;k<=j;k++) sum+=a[k]; if(sum>maxsum) maxsum=sum; } return maxsum; } int main() { int i,j,T;int num; //time_t start,end; // start=time(NULL); scanf("%d",&T); while(T--) { scanf("%d",&num); memset(a,0,sizeof(a)); for(i=0;i<num;i++) scanf("%d",a+i); printf("%d\n",subsequencesum(a,num)); } // end=time(NULL); // printf("%d\n",end-start); return 0; }