本文该处了最大字段和问题的朴素算法,分治法,动态规划法的实现.
/**/
/*
* 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(string, 0, 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;
}
* 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(string, 0, 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;
}