算法不归路之最大子序列(C++版)

题目摘自《算法导论(第三版)》

  题目:给定一串整形序列,求出此序列的最大子序列。

  分析:此题可以采用暴力求解法,如何暴力求解呢?从下标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

posted @ 2015-10-19 18:56  VF_Ever  阅读(772)  评论(0编辑  收藏  举报