*[codility]MaxDoubleSliceSum

https://codility.com/demo/take-sample-test/max_double_slice_sum

两个最大子段和相拼接,从前和从后都扫一遍。注意其中一段可以为0。还有最后和最前面一个不可能取到~

#include <vector>



using namespace std;



int solution(vector<int> &A) {

    vector<int> maxEnd;

    maxEnd.resize(A.size());

    maxEnd[0] = 0;

    for (int i = 1; i < A.size(); i++) {

        maxEnd[i] = max(0, maxEnd[i - 1] + A[i]);

    }

    vector<int> maxBegin;

    maxBegin.resize(A.size());

    maxBegin[A.size() - 1] = 0;

    for (int i = A.size() - 2; i >= 0; i--) {

        maxBegin[i] = max(0, maxBegin[i + 1] + A[i]);

    }

    int result = maxEnd[0] + maxBegin[2];

    for (int i = 0; i + 2 < A.size(); i++) {

        int current = maxEnd[i] + maxBegin[i + 2];

        result = max(result, current);

    }

    return result;

}

  

你可能感兴趣的:(double)