解决这个问题,采用前缀和平扫的时间复杂度为O(n^2),本文分治法的时间复杂度为O(n*log*(n))
前缀和平扫首先对n个数做前缀和,接下来利用前缀和枚举每一个区间即可
分治法的代码实现如下:
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 const int maxn=20000005; 5 const int INF=0x7fffffff; 6 long long a[maxn]; 7 int n; 8 long long maxsum(long long* A,int x,int y) 9 { 10 long long v,L,R,maxs=-INF; 11 if(y-x==1) 12 return A[x]; 13 int m=x+(y-x)/2; 14 maxs=max(maxsum(A,x,m),maxsum(A,m,y)); 15 v=0; 16 L=A[m-1]; 17 for(int i=m-1;i>=x;i--) 18 L=max(L,v+=A[i]); 19 v=0; 20 R=A[m]; 21 for(int i=m;i<y;i++) 22 R=max(R,v+=A[i]); 23 return max(maxs,L+R); 24 } 25 int main() 26 { 27 cin>>n; 28 if(n!=0) 29 { 30 for(int i=1;i<=n;i++) 31 { 32 cin>>a[i]; 33 } 34 cout<<maxsum(a,1,n+1)<<endl; 35 } 36 return 0; 37 }
具体实现原理将在后续补充。
原文地址:https://www.cnblogs.com/aininot260/p/9305904.html
时间: 2024-10-09 22:02:02