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) /* Base Case*/ 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 maxSubSum(const int *src,int left,int right){ int maxLeftSum, maxRightSum; int maxLeftBorderSum = 0, maxRightBorderSum = 0; int leftBorderSum = 0, rightBorderSum = 0; int center, i; if(left == right){ return *(src + left) ; } center = (right + left)/2; maxLeftSum = maxSubSum(src, left ,center); maxRightSum = maxSubSum(src, center + 1,right); maxLeftBorderSum = *(src + center); for (i = center; i >= left; --i) { if((leftBorderSum += *(src + i)) > maxLeftBorderSum) maxLeftBorderSum = leftBorderSum; } maxRightBorderSum = *(src + center + 1); for (i = center + 1; i <= right; ++i) { if((rightBorderSum += *(src + i)) > maxRightBorderSum) maxRightBorderSum = rightBorderSum; } return MAX((maxLeftBorderSum + maxRightBorderSum), MAX(maxLeftSum, maxRightSum)); }
int main() { const int a[] = {4, -3, 5, -2, -1, 2, 6, -2}; printf("max sub sum: %d\n", maxSubSum(a, 0, 7)); return 0; }
int main() { int *a; int i,len; printf("请输入数组长度:\n"); scanf("%d",&len); a = (int *)malloc(len * sizeof(int)); printf("请输入数组元素:\n"); for(i = 0;i < len;i++) { scanf("%d",a+i); } maxSubSum(a,len); free(a); return 0; }
int main() { std::array<int, 7> a {{-10, -1 , -5, 14, -3, 4, -7}}; std::cout << maxSubSum(a) << std::endl; return 0; }
//最大子序列的和,时间--O(N*logN),空间--0 int maxSubsequenceSum(const int *src, int len){ return maxSubSum(src, 0, len - 1); }