最大连续和的定义:给出一个长度为n的序列A1,A2,...,An,求最大连续和,即找要求找到1<=i<=j<=n,使得Ai+Ai+1+..+Aj最大。
方法一,根据定义容易想到:
int maxSubSeqSum(int A[],int N) { int maxSum=A[0]; int i,j,k; for(i=2;i<N;i++) for(j=i;j<N;j++) { int sum=0; for(k=i;k<=j;k++) { sum+=A[k]; } if(sum>maxSum) maxSum=sum; } return maxSum; }
方法二
int maxSubSeqSum(int A[],int N) { int i,j; int maxSum=A[0]; for(i=1;i<N;i++) { int sum=0; for(j=i;j<N;j++) { sum+=A[j]; if(sum>maxSum) maxSum=sum; } } return maxSum; }
方法三
int max(int a,int b) { return a>b?a:b; } int maxSubSeqSum(int a[],int x,int y) { if(y-x==1) return a[x]; int m=x+(y-x)/2; int maxValue=max(maxSubSeqSum(a,x,m),maxSubSeqSum(a,m,y)); /// a[x,m) a[m,y) int leftSum=0; int leftMaxValue=a[m-1]; int i; for(i=m-1;i>=x;i--) { leftMaxValue=max(leftMaxValue,leftSum+=a[i]); } int rightSum=0; int rightMaxValue=a[m]; for(i=m;i<y;i++) { rightMaxValue=max(rightMaxValue,rightSum+=a[i]); } return max(maxValue,leftMaxValue+rightMaxValue); }
方法四
int maxSubSeqSum( int A[], int N ) { int ThisSum, MaxSum; int i; ThisSum = MaxSum = 0; for( i = 0; i < N; i++ ) { ThisSum += A[i]; /* 向右累加 */ if( ThisSum > MaxSum ) MaxSum = ThisSum; /* 发现更大和则更新当前结果 */ else if( ThisSum < 0 ) /* 如果当前子列和为负 */ ThisSum = 0; /* 则不可能使后面的部分和增大,抛弃之 */ } return MaxSum; }
方法一到方法四,算法的复杂度依次降低,方法一时间复杂度O(N^3),方法二时间复杂度O(N^2),方法三时间复杂度O(NlogN),方法四时间复杂度O(N)
时间: 2024-10-29 19:05:32