Maximin of substring

 本文该处了最大字段和问题的朴素算法,分治法,动态规划法的实现.

 

  /*
  * Description: a directing approach 
  * name: sum_of_substring
  * parameters: string: string to calculate the maximun sum.
  *             len   : the length of string
  * version: 1.0
  * author: lizuding@gmail.com
  * data: 2008-1-29
  
*/


int  sum_of_substring( int   *   string const   int   &  len)  {
    
int sum = 0;
    
for (int i = 0; i < len; ++ i)
        
for (int j = i; j < len; ++ j) {
            
int subsum = 0;
            
for (int k = i; k <= j; ++ k)
                subsum 
+= string[k];
            
if (sum < subsum)
                sum 
= subsum;
        }

     
return sum;
}



 
/*
  * Description: revised version of directing approach 
  * name: sum_of_substring
  * parameters: string: string to calculate the maximun sum.
  *             len   : the length of string
  * version: 1.1
  * author: lizuding@gmail.com
  * data: 2008-1-29
  
*/


int  sum_of_substring( int   *   string const   int   &  len)  {
    
int sum = 0;
    
for (int i = 0; i < len; ++ i) {
        
int subsum = 0;
        
for (int j = i; j < len; ++ j) {        
            subsum 
+= string[j];
            
if (sum < subsum)
                sum 
= subsum;
        }

    }
    
    
return sum;
}


 
/*
  * Description: divide and conquer
  * name: sum_of_substring
  * parameters: string: string to calculate the maximun sum.
  *             len   : the length of string
  * version: 1.1
  * author: lizuding@gmail.com
  * data: 2008-1-29
  
*/


int  max_sub_sum( int   * s,  int  left,  int  right)  {
    
int sum = 0;
    
int subsum = 0;    
    
    
if (left == right) return s[left] > 0 ? s[left] : 0;
    
    
int mid = (left + right) / 2;
    
int sum_of_left = max_sub_sum(s, left, mid);
    
int sum_of_right = max_sub_sum(s, mid + 1, right); 
    
    
int presum = 0;
    
int tmp_of_left = 0;
    
for (int i = mid; i >= left; -- i) {
        tmp_of_left 
+= s[i];
        
if (tmp_of_left > presum)
            presum 
= tmp_of_left;
    }

    
    
int postsum = 0;
    
int tmp_of_right = 0;
    
for (int i = mid + 1; i <= right; ++ i) {
        tmp_of_right 
+= s[i];
        
if (tmp_of_right > postsum)
            postsum 
= tmp_of_right;
    }

    
    sum 
= presum + postsum;
    
if ( sum < sum_of_left ) return sum_of_left;
    
if ( sum < sum_of_right ) return sum_of_right;
    
return sum;
}
    
        
    
int  sum_of_substring( int   *   string const   int   &  len)  {
    
return max_sub_sum(string0, len - 1);
}
    


 
/*
  * Description: Dynamic Programming
  * name: sum_of_substring
  * parameters: string: string to calculate the maximun sum.
  *             len   : the length of string
  * version: 1.1
  * author: lizuding@gmail.com
  * data: 2008-1-29
  
*/

 
int  sum_of_substring( int   *   string const   int   &  len)  {
    
int sum = 0;
    
int tmp_sum = 0;
    
for ( int i = 0; i < len; ++ i ) {
        
if ( tmp_sum < 0 ) tmp_sum = string[i];
        
else tmp_sum += string[i];
        
        
if ( sum < tmp_sum )
            sum 
= tmp_sum;
    }

    
    
return sum;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值