最长子序列和问题

来源:互联网 发布:linux安全认证 编辑:程序博客网 时间:2024/06/13 16:04
分享4个处理算法,算法复杂度分别为N^3 N^2 NlogN N
//algorithm1//Cubic maximum contiguous subsequence sum algorithmint maxSubSum1( const vector<int> &a){int maxSum = 0;for( int i = 0; i < a.size(); i++)for( int j = i; j < a.size(); j++){int thisSum = 0;for( int k = i; k <= j; k++ )thisSum += a[ k ];if( thisSum > maxSum )maxSum = thisSum;}return maxSum;}//algorithm2//Quadratic maximum contiguous subsequence sum algorithmint maxSubSum2( const vector<int> & a){int maxSum = 0;for( int i = 0; i < a.size(); i++){int thisSum = 0;for( int j = i; j < a.size(); j++){thisSum += a[ j ];if( thisSum > maxSum)maxSum = thisSum;}}return maxSum;}//algorithm3int maxSumRec( const vector<int> & a, int left, int right ){if( left == right ) //base caseif( a [ left ] > 0 )return a[ left ];elsereturn 0;int center = ( left + right ) / 2;int maxLeftSum = maxSumRec( a, left, center );int maxRightSum = maxSumRec( a, center + 1, right);int maxLeftBorderSum = 0, leftBorderSum = 0;for( int i = center; i >= left; i--){leftBorderSum += a[ i ];if ( leftBorderSum > maxLeftBorderSum )maxLeftBorderSum = leftBorderSum;}int maxRightBorderSum = 0, rightBorderSum = 0;for( int j = center + 1; j <= right; j++ ){rightBorderSum += a[ j ];if( rightBorderSum > maxRightBorderSum )maxRightBorderSum = rightBorderSum;}return max3( maxLeftSum, maxRightSum, maxLeftBorderSum + maxRightBorderSum ); }//Driver for divide-and-conquer maximum contiguous subsequence sum algorithmint maxSubSum3( const vector<int> & a){return maxSumRec( a, 0, a.size() - 1);}//algorithm4//Linear-time maximum contiguous subsequence sum algorithm.int maxSubSum4( const vector<int> & a ){int maxSum = 0, thisSum = 0;for( int j = 0; j < a.size(); j++){thisSum += a[ j ];if( thisSum > maxSum )maxSum = thisSum;else if (thisSum < 0)thisSum = 0;}return maxSum;}

原创粉丝点击