您的位置:首页 > 其它

最长子序列和问题

2012-11-21 15:56 423 查看
分享4个处理算法,算法复杂度分别为N^3 N^2 NlogN N
//algorithm1
//Cubic maximum contiguous subsequence sum algorithm
int 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 algorithm
int 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;
}
//algorithm3
int maxSumRec( const vector<int> & 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<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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: