问题:
求数组的子数组之和的最大值
解法一:
遍历
#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\n", 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\n", MaxSum(array, 5));
return 0;
}