数据结构 最大子序列和

来源:互联网 发布:c语言char怎么赋值 编辑:程序博客网 时间:2024/05/17 22:50

最大子序列问题描述:



给定N个数(其中可能有负数),求解 最大的子序列和。


int maxsubsum1(const int A[] , int n){int thissum , max ,  k ;max = 0 ;for ( int i = 0 ; i < n;++i)   for(  int j = i ; j < n ;++j)       {        thissum = 0 ;        for ( k = i ; k <= j ;++k)             thissum  += A[k];        if ( thissum > max )             max = thissum ;       }return max;}
</pre><pre name="code" class="cpp">
穷举所有可能,复杂度N的三次方。
<pre name="code" class="cpp">int maxsubsum2(const int A[], int n){int thissum  , max = 0 ; for ( int i = 0 ; i < n ;++i){        thissum = 0 ;  for ( int j = i ; j < n ; ++j)    {      thissum  += A[j] ;            if ( thissum > max )           max = thissum ;          }      }    return max ;    }

算法复杂度 复杂度N的平方。

int maxsubsum3(const int A[], int n){     int thissum , maxsum  ;     thissum = maxsum = 0 ;     int maxele = A[0];// 如果数组全为负数,maxele为最大值     for ( int i = 0 ; i < n ; ++i)      {           thissum += A[i];           if ( thissum > maxsum)               maxsum = thissum;   else  if ( thissum < 0)               thissum = 0 ;            if (maxele < A[i])            maxele = A[i];     }      return maxsum > maxele ? maxsum : maxele ;//比较最大和 和 最大值 ,}


</pre><pre name="code" class="cpp">
分治递归。。。。好厉害
<pre name="code" class="cpp">static int maxsub(const int A[] , int l , int r){int maxlsum , maxrsum;int maxlbsum , maxrbsum ;int lbsum , rbsum ;int center ;int max ;if( l == r)   if (A[l] > 0) return A[l];  else return 0;  center = (l+r)/2;maxlsum = maxsub(A,l,center);maxrsum = maxsub(A,center+1,r);maxlbsum=0; lbsum = 0;for ( int i = center ; i >= 0;--i){  lbsum += A[i];  if (lbsum > maxlbsum)      maxlbsum = lbsum;}maxrbsum=0; rbsum = 0;for ( int i =center+1; i < r;++i){rbsum += A[i];if ( rbsum > maxrbsum)    maxrbsum = rbsum;}max = maxlsum > maxrsum ? maxlsum : maxrsum;max = max > (maxlbsum + maxrbsum) ? max : (maxlbsum+maxrbsum);return max;}int maxsubsum4(const int A[] , int n){maxsub(A,0,n-1);}




0 0