最大子串

最大子串

时间限制: 1 Sec 内存限制: 0 MB
提交: 31 解决: 14
[提交][状态][讨论版]
题目描述

给定一整型数列{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

题意:在一整型数列中找出连续非空的最大子串,所谓连续非空的最大子串是指数列中连续的数相加最大。
思路:我们可以用一个整型数组把整形数列存进去,把最大值设为0,然后用两个for循环嵌套实现从数列的第一项开始依次往后加,每加一次与最大值比较一次,直到找到最大的那个。
代码

#include<stdio.h>                                                    //c语言的头文件
int a[1000005];                                                         //定义一个整型的数组
int main()
{
	int max,num=0,n,m,i,j;
	scanf("%d",&m);
	while(m--)                                                              //循环m次
	{
		max=0;                                                               //每次循环max的初值设为0
		scanf("%d",&n);
		for(i=0;i<n;i++)
			scanf("%d",&a[i]);                                          //用一个for循环把数列中的数一个个存在数组中
		for(i=0;i<n;i++)//外循环
		{
			for(j=i,num=0;j<n;j++)                                     //内循环,(外循环每循环一次num的初值都设为0)
			{
				num+=a[j];                                               //数列相加
				if(num>max)                                               //判断
				{
					max=num;
				}
			}
		}
		printf("%d\n",max);
	}
	return 0;
}

运行结果
在这里插入图片描述
总结:要学会灵活的运用for循环哦!

猜你喜欢

转载自blog.csdn.net/qq_43730272/article/details/86659330