给定一个整数序列,a0, a1, a2, …… , an(项可以为负数),求其中最大的子序列和。如果所有整数都是负数,那么最大子序列和为0;
第一个算法可以穷举出所有的可能,如下图所示:
int maxSubSum1( const int a[],int N )
{
int maxSum = 0;
for(int i=0; i<N; i++ )
{
for(int j=i; j<N; j++ )
{
int thisSum =0;
for( int k=i; k<=j; k++ )
{
thisSum += a[k];
}
if(thisSum>maxSum)
{
maxSum = thisSum;
}
}
}
return maxSum;
}
算法2:求出在所有位置开始的子序列,找到最大的
int maxSubSum2( const int a[],int N )
{
int maxSum = 0;
for(int i=0; i<N; i++ )
{
int thisSum =0;
for(int j=i; j<N; j++ )
{
thisSum +=a[j]; //从节点i开始 累加到结尾
if(thisSum>maxSum)
{
maxSum = thisSum;
}
}
}
return maxSum;
}
最简单的方法:
int maxSubSum3_4( int a[],int N )
{
int maxSum = 0;
int thisSum = 0;
for(int j=0; j<N; j++ )
{
thisSum += a[j];
if(thisSum>maxSum)
{ maxSum = thisSum; }
else if( thisSum < 0 )
{ thisSum = 0; }
}
return maxSum;
}