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