2.14 子数组之和的最大值

问题:

求数组的子数组之和的最大值


解法一:

遍历

#include <stdio.h>
#include <stdlib.h>

int MaxSum(int* A, int n)
{
    int maximum = -100;
    int sum = 0;
    int i = 0, j = 0, k = 0;
    for (i = 0; i < n; i++)
    {
        for(j = i; j < n; j++)
        {
            for(k = i; k <= j; k++)
            {
                sum += A[k];
            }
            if (sum > maximum)
                maximum = sum;
        }
    }
    return maximum;
}

int main()
{
    int array[] = {-9, -2, -3, -5, -3};
    printf("%d
", MaxSum(array, 5));
    return 0;
}



解法二:

分治法,考虑A[0]以及最大的一段数组(A[i],...,A[j])之间的关系。

1. 当0=i=j,元素A[0]本身构成和最大的一段。

2. 当0=i<j,和最大的一段以A[0]开始。

3. 当0<i时,元素A[0]跟和最大的一段没有关系。

#include <stdio.h>
#include <stdlib.h>

int max(int x, int y)
{
    return (x > y) ? x :y;
}

int MaxSum(int* array, int n)
{
    int nStart = 0;
    int aAll = 0;
    int i = 0;
    nStart = array[n-1];
    aAll = array[n-1];
    for (i = n-2; i >= 0; i--)
    {
        nStart = max(array[i], nStart + array[i]);
        aAll = max(nStart, aAll);
    }
    return aAll;
}

int main()
{
    int array[] = {-9, -2, -3, -5, -3};
    printf("%d
", MaxSum(array, 5));
    return 0;
}


原文地址:https://www.cnblogs.com/pangblog/p/3310553.html