其他分享
首页 > 其他分享> > PAT A1007 Maximum Subsequence Sum

PAT A1007 Maximum Subsequence Sum

作者:互联网

知识点: 动态规划:最大连续子序列之和

题意

求最大连续子序列之和,输出最大的和以及这个子序列的首尾元素。如果所有数都小于0,那么认为最大和为0,并且输出整个序列的首尾元素。如果有多组答案,输出下标最小的那组。

思路

在读入时累加和到nowSum,如果nowSum为负,说明一组正数的和加上若干个负数的和为负数,答案的子序列不能包括这部分,此时应把nowSum置0,代表
子序列至少应该从下一个元素开始。nowSum的最大值就是答案,用另一个变量sum来记录。将sum初值设为-1,在更新时就不会漏掉子序列为一个0的这种
情况了,如果全为负数,在读入完成时,sum应该还是-1,这种情况也就可以处理了。

代码

#include <iostream>

using namespace std;

int arr[10010];

int main() {
    cin.tie(nullptr);
    ios::sync_with_stdio(false);

    int n;
    cin >> n;

    int left = 0, right = n - 1, sum = -1, nowSum = 0, nowLeft = 0;
    for (int i = 0; i < n; ++i) {
        cin >> arr[i];
        nowSum += arr[i];

        if (nowSum < 0) {
            nowSum = 0;
            nowLeft = i + 1;
        } else if (nowSum > sum) {
            sum = nowSum;
            left = nowLeft;
            right = i;
        }
    }

    cout << max(sum, 0) << " " << arr[left] << " " << arr[right];
}

标签:arr,PAT,nowSum,int,sum,Subsequence,A1007,序列,nowLeft
来源: https://blog.csdn.net/Exupery_/article/details/100577625