最大子序列和的线性求解算法

主要思路:该算法的主要算法主要是考虑权重和采用迭代的思想解决
第一步:我们首先得到一个线性序列,A[1……n],当只有A[1]时,我们得知,该线性序列最大子序列为A[1]
第二步:迭代该序列,我们得到A[1….j],第一次 进行第一步时j = 2,此时最大子序列为A[1]或A[1,2],我们可知A[1] + A[2]如果小于A[2],我们可知,这两项的权重相当于正数序列加上一个负数,相当于加上一个负权重(拖后腿的)还不如不加,如此便考虑A[1],A[2]谁符合最大子序列,如果A[1] + A[2]如果大于等于A[2],那么最大子序列肯定在A[1]和A[1] + A[2]中产生
第二步关键思想:对于求最大子序列,最重要的是去除拖后腿序列(项数大于二),如果一个序列A[1…n]的子序列A[i…j](n >= 2,j <= n, )相对于A[j]带来负增益,我们就称他为拖后腿序列,如 -10,-30, 60,我们就称[-10,-30],[-10,-30,60]为拖后腿序列,而40,-10 60的[40,-10,60]则不是拖后腿序列,则可知最大子序列在迭代前的最大非拖后腿和迭代后的最大非拖后腿序列中产生。
第二步抽象化:对于给定序列我们已经通过已知条件得知最大非拖后腿序列和为maxArray,迭代后,序列新增一项,我们称为A[j],此时我们需要知道此时的非拖后腿序列一定包含A[j](如果不包含A[j],那么此时的最大非拖后腿序列一定还是迭代前的序列),此时如果maxArray + A[j] < A[j],则maxArray + A[j[为拖后腿序列,故此时的最大非拖后腿序列和为A[j[,否则为maxArray +A[j],然后进行比较选举最大子序列和,然后进行下一步迭代

代码:

#include <iostream>
#include <vector>
#include <stdio.h>
using namespace std;

struct part {
    int start_pos;
    int end_pos;
    int part_sum;
};
int find_maxsum_subarray(const vector<int>& vec) {
    struct part maxPart { 0, 0, vec[0] };
    struct part boundPart { 0, 0, vec[0] };
    for (int i = 1; i < vec.size(); ++i) {
        if (boundPart.part_sum + vec[i] >= vec[i]) {
            boundPart.part_sum += vec[i];
            boundPart.end_pos = i;
            if (maxPart.part_sum <= boundPart.part_sum) {
                maxPart.start_pos = boundPart.start_pos;
                maxPart.end_pos = boundPart.end_pos;
                maxPart.part_sum = boundPart.part_sum;
            }
        }else {
            boundPart.start_pos = i;
            boundPart.end_pos = i;
            boundPart.part_sum = vec[i];
            if (maxPart.part_sum <= boundPart.part_sum) {
                maxPart.start_pos = boundPart.start_pos;
                maxPart.end_pos = boundPart.end_pos;
                maxPart.part_sum = boundPart.part_sum;
            }
        }
    }
    printf("start_pos: %d end_pos: %d maxsum: %d", maxPart.start_pos, maxPart.end_pos, maxPart.part_sum);
    return 0;
}
int main(int argc, char** argv) {
    vector<int> vec = { 13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7 };
    find_maxsum_subarray(vec);
    system("pause");
    return 0;
}

这里写图片描述

猜你喜欢

转载自blog.csdn.net/rgbmarco/article/details/79927588
今日推荐