一开始用暴力枚举,两层循环时间复杂度为O(n^2),提交不出意外的超时了。
想要不超时,很直观的办法就是减少一层循环就行。
思路是:
假设你已知一段序列中的最大子序列,你可以发现这段子序列的第一个数的前面那些数的和是小于零的,这段序列的最后一个数的后面那些数是小于零的。
有这一点可以减小一层循环。
#include<iostream>
#define Manx 100010
using namespace std;
int main(){
int T,k=0;
cin>>T;
while(T--){
int N;
cin>>N;
int f[Manx];
int start=0,end=0,max=-1001,sum=0,startbegin=0,endfinsh=0;
if(k++) cout<<endl;
for(int i=0;i<N;i++)
cin>>f[i];
for(int i=0;i<N;i++)
{
if(sum>=0)
{
sum+=f[i];
end=i;
}
else{
sum=f[i];
start=i;
end=i;
}
if(sum>max)
{
max=sum;
endfinsh=end;
startbegin=start;
}
}
printf("Case %d:\n",k);
cout<<max<<" "<<startbegin+1<<" "<<endfinsh+1<<endl;
}
return 0;
}