求解最大子列和问题——MaxSubSum

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/a359696929/article/details/51165546

       求解最大子列和问题,有很多方法,最简单粗暴的方法就是找出所有子列并计算出子列和,找出最大子列和,但是这种方法效率十分低。要想高效,快速,巧妙的解出最大子列和,就要考虑用更好的方法。

       “分而治之”就是解决这一问题的基本思想,在所有子列中,最大子列和可能整个出现在输入数据的左半部分,也有可能整个出现在右半部分,还有可能跨越输入数据的中部,占据左半部分和有半部分。

       前两种情况,我们可以用递归的方式,把左右两半部分多次对分,直至对分至只有两个数据进行比较,依次返回较大子列和,来求出左半部分和右半部分的最大子列和。

第三种跨越左半边和右半边的情况,可以通过求出左半部分最大和(包括左边最后一个元素),右半部分最大和(包括右边第一个元素),然后将这两个值相加。

然后比较左边最大子列和,右边最大子列和,跨越中部最大子列和,来求出这个输入数据的最大子列和。

示例程序如下:

//
//  main.c
//  最大子列和
//
//  Created by 徐悟源 on 16/4/11.
//  Copyright © 2016年 Wuyuan. All rights reserved.
//

#include <stdio.h>

/**
 *  find a max integer in a,b,c
 *
 */
static int max3(int a , int b , int c)
{
    return (a>b?a:b)>c?(a>b?a:b):c;
    
}

static int maxSubSum(const int A[] , int left , int right)
{
    int maxLeftSum , maxRightSum;
    int maxLeftBorderSum , maxRightBorderSum;
    int leftBorderSum , rightBorderSum;
    int center , i;
    
    if(left == right)
    {
        if(A[left] > 0)
            return A[left];
        else
            return 0;
    }
    
    center = (left + right)/2;
    maxLeftSum = maxSubSum(A, left, center);
    maxRightSum = maxSubSum(A, center+1, right);
    
    maxLeftBorderSum = 0;
    leftBorderSum = 0;
    for (i = center; i>=left; i--) {
        leftBorderSum += A[i];
        if(leftBorderSum > maxLeftBorderSum)
            maxLeftBorderSum = leftBorderSum;
    }
    
    maxRightBorderSum = 0;
    rightBorderSum = 0;
    for (i = center + 1; i<=right; i++) {
        rightBorderSum += A[i];
        if(rightBorderSum > maxRightBorderSum)
            maxRightBorderSum = rightBorderSum;
    }
    
    return max3(maxLeftSum , maxRightSum , maxLeftBorderSum + maxRightBorderSum);
    
}

int main(int argc, const char * argv[]) {
    // insert code here...
    printf("Hello, World!\n");
    
    int arr[8]= {0};
    
    for(int i = 0; i <8 ; i++)
    {
        printf("type in the integer : ");
        scanf("%d",&arr[i]);
    }
    
    printf("the max sub arr sum is : %d\r",maxSubSum(arr, 0, 7));
    
    return 0;
}



展开阅读全文

没有更多推荐了,返回首页