子串和
描述
给定一整型数列{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
想法:
动态规划,注意不能用双重for循环;会超时的!
因子序列必须是连续的,所以用data【i】来更新从1到i的各数组之和,若data【i-1】是负数则data【i】=a【i】,重新开始新子序列。
只要找到data【】中最大值则是最大的连续子串的和。
代码:
#include<stdio.h>
#include<string.h>
int a[1000010];
int data[1000010];
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
int i,j,m;
memset(a,0,sizeof(a));
memset(data,0,sizeof(data));
scanf("%d",&m);
for(i=1;i<=m;i++)
{
scanf("%d",&a[i]);
}
int maxx=-99999;
for(i=1;i<=m;i++)
{
if(data[i-1]>0) data[i]=data[i-1]+a[i];
else data[i]=a[i];
if(maxx<data[i])
maxx=data[i];
}
printf("%d\n",maxx);
}
return 0;
}
优化前面代码:
#include<stdio.h>
02.
int
main()
03.
{
04.
int
n,sum,m,i;
05.
scanf
(
"%d"
,&n);
06.
while
(n--)
07.
{
08.
scanf
(
"%d"
,&m);
09.
scanf
(
"%d"
,&sum);
10.
int
maxx=sum;
11.
while
(--m)
12.
{
13.
scanf
(
"%d"
,&i);
14.
if
(sum<0) sum=i;
15.
else
sum+=i;
16.
if
(maxx<sum)
17.
maxx=sum;
18.
}
19.
printf
(
"%d\n"
,maxx);
20.
}
21.
return
0;
22.
}