题目:给定一个整数序列,a0, a1, a2, …… , an(项可以为负数),求其中最大的子序列和。如果所有整数都是负数,那么最大子序列和为0;
之前思路:
#include<cstdio>
int main(){
int i,j,max=0,sum=0,flag=0,flag1,flag2;
int n,a[10005];
while(scanf("%d",&n)&&n){
flag=0;
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<n;i++){
if(a[i]>0){
flag=1;
break;
}
}
if(n==1)
flag=2;
if(flag==0)
printf("0 %d %d\n",a[0],a[n-1]);
if(flag==2)
printf("%d %d %d\n",a[0],a[0],a[0]);
if(flag==1){
max=0;
for(i=0;i<n;i++){
sum=a[i];
for(j=i+1;j<=n-i;j++){
sum+=a[j];
if(sum>max){
max=sum;
flag1=a[i];
flag2=a[j];
}
}
}
printf("%d %d %d\n",max,flag1,flag2);
}
}
return 0;
}
错误原因:超时
AC代码:
#include <iostream>
#include <cstdio>
using namespace std;
int a[10005];
int main()
{
int n,t,flag,sum,s,e,Max;
while(~scanf("%d",&n)&&n)
{
flag=1;
Max=0;
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
if(a[i]>=0)
flag=0;
}
if(flag)
{
printf("%d %d %d\n",Max,a[0],a[n-1]);
continue;
}
else
{
sum=a[0];
Max=a[0];
t=0;
s=0;
e=0;
for(int i=1;i<n;i++)
{
if(sum<0)
{
t=i;
sum=0;
}
sum+=a[i];
if(sum>Max)
{
Max=sum;
e=i;
s=t;
}
}
}
printf("%d %d %d\n",Max,a[s],a[e]);
}
return 0;
}