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

标签 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 语句中,如果 a[left] < 0,为什么返回 0?

  2. 为什么需要 2 个 for 循环?不是这样的逻辑吗,求前半部分和后半部分的最大值,然后相加,看相加是否比两者都大。 如果是这种情况,那我们可以直接跳到最后2行吗?

非常感谢,

岳哈丽特

最佳答案

  1. in the first if statement, why return 0 if a[left] < 0?

因为此时空子序列的和最大,为0。

关于c++ - 返回序列中子序列的最大可能总和的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/624540/

相关文章:

algorithm - 映射函数

c++ - 如何阻止客户检查您库中的源代码

c++ - 多重继承的模糊解决方法?

c++ - 将结构作为多映射中的键传递时出错

javascript - d3.js 如何简化复杂路径 - 使用自定义算法

c++ - 考虑STL容器操作的复杂性

c++ - 在 gtk 文本字段中交换背景颜色 (gtkmm C++)

c++ - 如何在 Qt C++ 中向自定义控件添加属性?

algorithm - 随机游走以找到成本更高的路径

iphone, 图像处理