HDOJ 1003.Max Sum 答案
原创
©著作权归作者所有:来自51CTO博客作者wx6405ffeaceb54的原创作品,请联系作者获取转载授权,否则将追究法律责任
没想到不仅仅只用O(n)的时间复杂度,连空间复杂度都能是O(1).
#include<stdio.h>
#include<climits>
int main()
{
int N,T,i,t,ai;
long Sum,SumT;
int beg,end,begT;
scanf("%d",&T);
for(t=1;t<=T;++t)
{
scanf("%d",&N);
if(N==0)
continue;
begT=1;
Sum=INT_MIN;
SumT=0;
for(i=1;i<=N;++i)
{
scanf("%d",&ai);
SumT+=ai;
if(Sum<SumT)
{
beg=begT;
end=i;
Sum=SumT;
}
if(SumT<0)
{
SumT=0;
begT=i+1;
}
}
printf("Case %d:\n",t);
printf("%ld %d %d\n",Sum,beg,end);
if(t!=T)
printf("\n");
}
return 0;
}
下面这个暴力方法复杂度O(n2),但是超时了 Time Limit Exceeded (TLE)
#include<stdio.h>
#define MAXS 100005
int a[MAXS]={0};
int S[MAXS]={0};
int main()
{
int N,T,i,j,t;
long Sum,SumT;
int beg,end;
scanf("%d",&T);
for(t=1;t<=T;++t)
{
beg=1,end=1;Sum=a[1];
scanf("%d",&N);
if(N==0)
continue;
for(i=1;i<=N;++i)
scanf("%d",&a[i]);
S[1]=a[1];
for(i=2;i<=N;++i)
S[i]=S[i-1]+a[i];
for(i=1;i<=N;++i)
for(j=i;j<N;++j)
{
SumT=S[j]-S[i-1];
if(SumT>Sum)
{
Sum=SumT;
beg=i;
end=j;
}
}
printf("Case %d:\n",t);
printf("%ld %d %d\n\n",Sum,beg,end);
}
return 0;
}