6 -2 11 -4 13 -5 -2 10 -10 1 2 3 4 -5 -23 3 7 -21 6 5 -8 3 2 5 0 1 10 3 -1 -5 -2 3 -1 0 -2 0
20 11 13 10 1 4 10 3 5 10 10 10 0 -1 -2 0 0 0
哎、、这道题一看就有思路,可是老是有些小毛病。。。
求最大子串和:思路只要前面的总和是大于0的,我们就不应该舍弃他,如果前面的和小于0了,我们就舍弃他,这样就可以求最大子串和了。。。
求位置的话,后面得位置可以求,然后根据最大和求出前面那个位置、、
#include<stdio.h>
int main()
{
int n;
while(scanf("%d",&n))
{
if(n==0)
break;
int *a=new int[n];
int i;
int biaoji=0;
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
if(a[i]>=0)
{
biaoji=1;
}
}
int sum=0;
int max=-1;
int last=0;
for(i=0;i<n;i++)
{
sum+=a[i];
if(sum>max)
{
max=sum;
last=i;
}
if(sum<0)
{
sum=0;
}
}
if(biaoji==1)
{
int sum2=0;
int d=0;
for(int i=last;i>=0;i--)//有终点向前找起点
{
sum2+=a[i];
if(sum2==max)
{
d=i;
break;
}
}
printf("%d %d %d\n",max,a[d],a[last]);
}
else
{
printf("0 %d %d\n",a[0],a[n-1]);
}
max=0;
sum=0;
}
return 0;
}