您的位置:首页 > 其它

最大子串

2017-08-01 12:54 169 查看
输入
第一行是一个整数N(N<=10)表示测试数据的组数)

每组测试数据的第一行是一个整数n表示序列中共有n个整数,随后的一行里有n个整数I(-100=<I<=100),表示数列中的所有元素。(0<n<=1000000)
输出
对于每组测试数据输出和最大的连续子串的和。
样例输入
1
5
1 2 -1 3 -2


样例输出
5


对于本题若用f(i,j)表示i到j的最大子串需要枚举i和j,而本题数据较多不宜采用。而对于一个字串的连续子串分析不难有以下情况当字串的所有元素都为小于0时其最大子串一定是所有数中最大的一个数,而如果存在大于等于0的数其最大子串一定在正数与0的位置,而若字串被中间一段为负数子串分为两段时如果前一段正数字串和小于中间一段负数和则最大子串一定在两个正数串中否则为三段字串和。即若用sum表示前i个数的和,maxnum表示最大子串和时有:

当sum<0第i+1个数大于等于0时sum应重置为0即:sum=0;[b]sum+=num;maxnum=max{maxnum,sum}[/b]

当sum<0第i+1个数小于0时maxnum=max{maxnum,num}

不属于前两种的应做第三种决策:sum+=num;maxnum=max{maxnum,sum}

#include<stdio.h>
#define INF 1000000
int max(int a,int b);
int main()
{
int N;
scanf("%d",&N);
while(N--)
{
int n;
int maxnum,sum;
maxnum=sum=-INF;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
int num;
scanf("%d",&num);
if(sum<0&&num>=0)
{
sum=0;
sum+=num;
maxnum=max(maxnum,sum);
}else if(sum<0&&num<0)
{
maxnum=max(maxnum,num);
}else
{
sum+=num;
maxnum=max(maxnum,sum);
}
}
printf("%d\n",maxnum);
}
return 0;
}
int max(int a,int b)
{
return a>b?a:b;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: