1410080630-ny-子串和

子串和

时间限制: 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
解题思路
       因为要找最大的子串和,所以其每一步的和都在更新变化之中,所以要考虑到动态变化。要判断子串从哪儿开始,可以用nowsum+num[i]<num[i]来判断,当一串数的和加上这个数之后的和要比这个数小,说明这之前一串数的和要为负数,所以舍弃。
代码
#include<stdio.h>
int num[1200000];
int main()
{
	int t,n;
	int nowsum,maxsum;
	int i,j;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d",&n);
		for(i=0;i<n;i++)
		    scanf("%d",&num[i]);
		nowsum=maxsum=num[0];
		for(i=1;i<n;i++)
		{
			if(nowsum+num[i]<num[i])
			    nowsum=0;
		//这一步的作用是判断子串的初始位置。
		//5 -7 2 8 。。。
		//这一步可以保证子串从2开始 
			nowsum+=num[i];
			if(nowsum>maxsum)
			    maxsum=nowsum;
		}
		printf("%d\n",maxsum);
	}
	return 0;
}

你可能感兴趣的:(1410080630-ny-子串和)