#include #include using namespace std; /** * Cubic maximum contiguous subsequence sum algorithm. */ int maxSubSum1( const vector & 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; } /** * Quadratic maximum contiguous subsequence sum algorithm. */ int maxSubSum2( const vector & 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; } /** * Return maximum of three integers. */ int max3( int a, int b, int c ) { return a > b ? a > c ? a : c : b > c ? b : c; } /** * Recursive maximum contiguous subsequence sum algorithm. * Finds maximum sum in subarray spanning a[left..right]. * Does not attempt to maintain actual best sequence. */ int maxSumRec( const vector & a, int left, int right ) { if( left == right ) // Base case if( a[ left ] > 0 ) return a[ left ]; else return 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 algorithm. */ int maxSubSum3( const vector & a ) { return maxSumRec( a, 0, a.size( ) - 1 ); } /** * Linear-time maximum contiguous subsequence sum algorithm. */ int maxSubSum4( const vector & 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; } /** * Simple test program. */ int main( ) { vector a( 8 ); a[ 0 ] = 4; a[ 1 ] = -3; a[ 2 ] = 5; a[ 3 ] = -2; a[ 4 ] = -1; a[ 5 ] = 2; a[ 6 ] = 6; a[ 7 ] = -2; int maxSum; maxSum = maxSubSum1( a ); cout << "Max sum is " << maxSum << endl; maxSum = maxSubSum2( a ); cout << "Max sum is " << maxSum << endl; maxSum = maxSubSum3( a ); cout << "Max sum is " << maxSum << endl; maxSum = maxSubSum4( a ); cout << "Max sum is " << maxSum << endl; return 0; }