HDOJ 1003.Max Sum 答案
阿新 • • 發佈:2019-01-12
方法來自:http://blog.csdn.net/wptad/article/details/1711857
沒想到不僅僅只用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; }