题目摘自《算法导论(第三版)》
题目:给定一串整形序列,求出此序列的最大子序列。
分析:此题可以采用暴力求解法,如何暴力求解呢?从下标0到数组长度剪1选取两个数,然后求解其间的所有值。也就是Cn2中组合。暴力代码不再贴出来。
经过分析此题可以用分治递归的方式。具体代码如下:
#include<iostream>
using namespace std;
const int N = -1024;
int findMaxCrossingSubarray(int arr[], int low, int mid, int high){
int leftSum = N, rightSum = N, sum = 0;
for(int i = mid; i != low - 1; --i){
sum = sum + arr[i];
if(leftSum < sum){
leftSum = sum;
}
}
sum = 0;
for(int i = mid + 1; i != high + 1; ++i){
sum = sum + arr[i];
if(rightSum < sum){
rightSum = sum;
}
}
return (leftSum + rightSum);
}
int findMaxSubarray(int arr[], int low, int high){
int left_sum, right_sum, cross_sum;
if(low == high){
return arr[low];
}
else{
int mid = (low + high)/2;
left_sum = findMaxSubarray(arr, low, mid);
right_sum = findMaxSubarray(arr, mid+1, high);
cross_sum = findMaxCrossingSubarray(arr,low,mid, high);
if(left_sum >= right_sum && left_sum >= cross_sum)
return left_sum;
else if(right_sum >= left_sum && right_sum >= cross_sum)
return right_sum;
else
return cross_sum;
}
}
int main(){
int a[16] = {13, -3, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7};
cout<<findMaxSubarray(a, 0, 15)<<endl;
return 0;
}
联系请发此邮箱:18829213810@126.com
原文:http://www.cnblogs.com/zhaoyansheng/p/4892757.html