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;
}
예제 #4
0
파일: maxSubSum_4.c 프로젝트: HunL/myACM
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;
}
예제 #5
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);
}