题目:求一串数字的和的最大值,并写出这个最大值的开始位置与结束位置。
题解:思路一、将所有数字录入后用穷举法求出所有字符串的值一一对比。但是该方法超时。
思路二、每一个数依次对比,在计算本数前先判断之前的数列最大值是否大于零,
大于零的话加上当前数后与最大值比较看新的数列和是否为最大值,
小于零的话则从当前数开始求新的数列和!并且与之前的最大值比较后选择数列的开始位置及最值。
代码:
#include<stdio.h>
int a[100010];
int main()
{
int t,n,r,s,i,max,st,en,m;
while(scanf("%d",&t)!=EOF)
{
for(r=1;r<=t;r++)
{
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
s=max=-99999; //s表示当前的和max表示最大值先都初始化。
m=st=en=1; //st为开始位置,en为结束位置,m为可能成为的开始位置。
for(i=1;i<=n;i++)
{
if(s<0) //加当前数之前的数列和小于零的话,和"S"直接为当前数,可能的开始位置为当前位置。
{
s=a[i];
m=i;
}
else //加当前数之前的数列和大于等于零的话,和"s"为"s"+当前数,
{
s+=a[i];
}
if(s>=max) //当前数列和“s”大于最大值时,改变最大值,将目前位置定义为最终位置,开始位置为m
{
max=s;
en=i;
st=m;
}
}
printf("Case %d:\n%d %d %d\n",r,max,st,en);
if(r!=t)
printf("\n");
}
}
return 0;
}
751

被折叠的 条评论
为什么被折叠?



