最大子序列求和问题
问题:
给定一整数序列A1, A2,... An (可能有负数),求A1~An的一个子序列Ai~Aj,使得Ai到Aj的和最大
例如:整数序列-2, 11, -4, 13, -5, 2, -5, -3, 12, -9的最大子序列的和为21。
//方案1,穷举法,三层循环求出每种可能的组合的和,O(n3) int MaxSum1(int array[],int length) { int maxval=array[0]; int tmp; for(int i=0;i<length;i++) { for(int j=i;j<length;j++) { tmp=0; for(int k=i;k<=j;k++) tmp+=array[k]; if(tmp>maxval) maxval=tmp; } } return maxval; } //方案2,减少一层循环,还是求出每一种可能组合的和,O(n2) int MaxSum2(int array[],int length) { int maxval=array[0]; int tmp; for(int i=0;i<length;i++) { tmp=0; for(int j=i;j<length;j++) { tmp+=array[j];//可以保存temp的值,因为实际上Sum(i, j+1) = Sum(i, j) + array[j+1] if(tmp>maxval) maxval=tmp; } } return maxval; } //方案3,线性方案,原理:任何一个和小于零的子序列不可能是最长子序列的一部分,O(n) int MaxSum3(int array[],int length) { int maxval=array[0]; int tmp=maxval; for(int i=1;i<length;i++) { tmp+=array[i]; if(tmp>maxval) maxval=tmp;//保存当前和最大的子序列的和 else if(tmp<0) //只要子序列的和不小于0,那么它就有可能是和最大的子序列的一部分 tmp=0; //当子序列和出现小于零,那么这部分一定不可能是最大子序列,我们需要重新计算子序列 } return maxval; }