/*
* 1. 最小的i和j
* 2. 若序列全为0,输出头尾元素。
*/
#include <iostream>
using namespace std;
int main(void) {
bool isNegative(true); //记录序列是否全为负数
int first(0), last(0); //记录第一个和最后一个输入数据。
//当前和、最大和、最小i、最小j、当前i。
int thisSum(0), maxSum(0), si(0), sj(0), currI(0);
bool isFirst(true); //标记子序列的第一个数字,辅助选出最小i。
int n, data;
cin >> n;
for(int m(0); m < n; ++m) {
cin >> data;
if(isNegative && data >= 0) isNegative = false;
if(m == 0) first = data;
if(m == n - 1) last = data;
thisSum += data;
if(isFirst && thisSum >= 0) {
currI = data; //当前子序列的最小i
isFirst = false;
}
if(thisSum > maxSum) {
si = currI; //thisSum > maxSum时,thisSum是最大子列,si更新。
maxSum = thisSum;
sj = data;
}
else if(thisSum < 0) {
thisSum = 0;
isFirst = true;
}
}
if(isNegative) cout << 0 << " " << first << " " << last;
else cout << maxSum << " " << si << " " << sj;
return 0;
}
01-复杂度2 Maximum Subsequence Sum (25分)
最新推荐文章于 2021-03-04 20:03:57 发布
本文介绍了一个寻找具有最大和的连续子序列的算法,并通过C++代码实现了该算法。文章考虑了序列全为负数的特殊情况,展示了如何确定子序列的起始和结束位置。

265

被折叠的 条评论
为什么被折叠?



