问题:
求数组的子数组之和的最大值
解法一:
遍历
#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; }