HDU 1003 Max Sum

来源:互联网 发布:矩阵理论答案 编辑:程序博客网 时间:2024/06/18 06:49

一开始用暴力枚举,两层循环时间复杂度为O(n^2),提交不出意外的超时了。

想要不超时,很直观的办法就是减少一层循环就行。


思路是:

假设你已知一段序列中的最大子序列,你可以发现这段子序列的第一个数的前面那些数的和是小于零的,这段序列的最后一个数的后面那些数是小于零的。

有这一点可以减小一层循环。

#include<iostream>#define Manx 100010using 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;} 


原创粉丝点击