且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

NYOJ 44(最大连续子序列和)

更新时间:2022-06-21 12:57:42

 

子串和

时间限制: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)
输出
对于每组测试数据输出和最大的连续子串的和。
样例输入
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;
}