返回序列中最大可能的子序列总和的算法

时间:2009-03-08 23:26:03

标签: c++ algorithm

int maxSumRec(const vector<int> &a, int left, int right){

    if (left == right){

               if (a[left] > 0){
        return a[left];
               }
               else
                  return 0;

    }

    int center = (left + right)/2;
    int maxLeftSum = maxSumRec(a, left, center);
    int maxRightSum = maxSumRec(a, center+1, right);

    int leftBorderSum = 0; int leftBorderMax = 0; 
    for (int i = center; i >= left; i--){

        leftBorderSum += a[i];
        if (leftBorderSum > leftBorderMax){

            leftBorderMax = leftBorderSum;
        }
    }

    int rightBorderSum = 0; int rightBorderMax = 0;
    for (int i = center+1; i <= right; i++){

        rightBorderSum += a[i];
        if (rightBorderSum > rightBorderMax){

            rightBorderMax = rightBorderSum;
        }

    }

    int crossSum = rightBorderMax + leftBorderMax;

    return max3(maxLeftSum, maxRightSum, crossSum);

}

这是一个O(NlogN)算法,我知道它不是最好的算法。但只是有几个问题:

  1. 在第一个if语句中,为什么如果[left]&lt; 0

  2. 为什么需要2 for循环?不是这样的逻辑,找到前半部分和后半部分的最大值,然后添加它们以查看添加是否大于任何一个。 如果是这种情况,那么我们可以直接跳到最后两行吗?

  3. 非常感谢,

    Yue Harriet

2 个答案:

答案 0 :(得分:3)

  
      
  1. 在第一个if语句中,为什么如果[left]&lt; 0?
  2.   

因为那时空子序列的最大总和为0。

答案 1 :(得分:1)

好的,我想出了第二个问题,因为我们必须处理连续的术语而不是跳跃术语。