最大子序列问题求解

来源:互联网 发布:linux 重启机器 编辑:程序博客网 时间:2024/05/20 06:31

给定一个整数序列,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;   }  



原创粉丝点击