最大子列和问题,即给定N个整数的序列{A1,A2,…,AN},求函数f(i,j)=max{0,i=0∑nAk}的最大值。
例如{−2,11,−4,13,−5,−2}的最大子列和为20,子列为{11,−4,13}.
{−10,1,2,3,4,−5,−23,3,7,−21}的最大子列和为10,子列为{1,2,3,4}。
本文将给出实现这种算法的Θ(N2)和Θ(N)算法
Θ(N2)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| int MaxSubseqSum(int A[], int N) { int ThisSum,MaxSum=0; int i,j; for(i=0;i<N;i++) { ThisSum=0; for(j = i; j < N; j++) { ThisSum += A[j]; if(ThisSum > MaxSum) MaxSum = ThisSum; } } return MaxSum; }
|
Θ(N)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| 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; }
|
第二种方法可能不是很好理解,有必要的话可以根据上面的例子手动推演一下。