最大子串
时间限制: 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循环哦!