最大的子序列和问题

最大的子序列和问题

求解该问题的四种算法:
时间O(N3),算法一
int  MaxSubsequenceSum( const   int  A[], int  N)
{
    
int  ThisSum,MaxSum,i,j,k;
    
    MaxSum 
=   0 ;
    
for (i  =   0 ;i  <  N;i ++ )
        
for (j  =  i;j  <  N;j ++ )
        
{
            ThisSum 
=   0 ;
            
for (k  =  i;k  <=  j;k ++ )    ThisSum  +=  A[k];                
            
if (ThisSum  >  MaxSum)    MaxSum  =  ThisSum;
        }

        
    
return  MaxSum;
}
时间O(N2),算法二
int  MaxSubsequenceSum( const   int  A[], int  N)
{
    
int  ThisSum,MaxSum,i,j;
    
    MaxSum 
=   0 ;
    
for (i  =   0 ;i  <  N;i ++ )
    
{
        ThisSum 
=   0 ;
        
for (j  =  i;j  <  N;j ++ )
        
{
            ThisSum 
+=  A[k];                
            
if (ThisSum  >  MaxSum)    MaxSum  =  ThisSum;
        }

    }

        
    
return  MaxSum;
}
时间O(NlogN),算法三
static   int  MaxSubSum( const   int  A[], int  Left, int  Right)
{
    
int  MaxLeftSum,MaxRightSum;
    
int  MaxLeftBorderSum,MaxRightBorderSum;
    
int  LeftBorderSum,RightBorderSum;
    
int  Center,i;
    
    
if (Left  ==  Right)
        
if (A[left]  >   0 )     return  A[left];
        
else      return   0 ;
            
    Center 
=  (Left  +  Right)  /   2 ;
    MaxLeftSum 
=  MaxSubSum(A,Left,Center);
    MaxRightSum 
=  MaxSubSum(A,Center  +   1 ,Right);
    
    MaxLeftBorderSum 
=   0 ;
    LeftBorderSum 
=   0 ;
    
for (i  =  Center;i  >=  Left;i -- )
    
{
        LeftBorderSum 
+=  A[i];
        
if (LeftBorderSum  >  MaxLeftBorderSum)    MaxLeftBorderSum  =  LeftBorderSum;
    }

    
    MaxRightBorderSum 
=   0 ;
    RightBorderSum 
=   0 ;
    
for (i  =  Center  +   1 ;i  <=  Right;i ++ )
    
{
        RightBorderSum 
+=  A[i];
        
if (RightBorderSum  >  MaxRightBorderSum)    MaxRightBorderSum  =  RightBorderSum;
    }

    
    
return  Max3(MaxLeftSum,MaxRightSum,MaxLeftBorderSum  +  MaxRightBorderSum);
}


int  MaxSubsequenceSum( const int   A[], int  N)
{
    
return  MaxSubSum(A, 0 ,N  -   1 );    
}
时间O(N),算法四
intMaxSubsequenceSum( const int  A[], int  N)
{
    
int  ThisSum,MaxSum,i;
    
    ThisSum 
=  MaxSum  =   0 ;
    
for (i  =   0 ;i  <  N;i ++ )
    
{
        ThisSum 
+=  A[i];
        
if (ThisSum  >  MaxSum)
            MaxSum 
=  ThisSum;
        
else
            ThisSum 
=   0 ;
    }

    
    
return  MaxSum;
}


参考《数据结构与算法分析》

你可能感兴趣的:(最大的子序列和问题)