利用分治法求n个数的最大连续和
Posted 静听风吟。
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用分治法求n个数的最大连续和相关的知识,希望对你有一定的参考价值。
解决这个问题,采用前缀和平扫的时间复杂度为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 }
具体实现原理将在后续补充。
以上是关于利用分治法求n个数的最大连续和的主要内容,如果未能解决你的问题,请参考以下文章