题解 | 最大连续子序列
最大连续子序列
https://www.nowcoder.com/practice/afe7c043f0644f60af98a0fba61af8e7
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <algorithm>
#include <vector>
using namespace std;
int dp[10001];
int s[10001] = {0};
int main() {
int k;
bool isMinus = true;
while (scanf("%d", &k) != EOF) {
if (k == 0) { break; }
int num;
for (int i = 0; i < k; ++i) {
scanf("%d", &num);
if (num >= 0) { isMinus = false; }
s[i] = num;
}
if (isMinus) {
int k = 0;
while (true) {
if (s[k] == 0) { break; }
++k;
}
printf("%d %d %d\n", 0, s[0], s[k - 1]);
break;
}
vector<int> pos;
int curmax = s[0];
dp[1] = s[0];
for (int j = 2; j <= k; ++j) {
if (dp[j - 1] <= 0) { dp[j] = s[j - 1]; }
else {
dp[j] = dp[j - 1] + s[j - 1];
}
if (dp[j] > curmax) {
pos.clear();
curmax = dp[j];
pos.push_back(j);
}
}
if (pos.size() != 0) {
int i = pos[0] - 1;
int total = s[i];
while (total != curmax) {
i = i - 1;
total += s[i];
}
int j = pos[0] - 1;
printf("%d %d %d\n", curmax, s[i], s[j]);
pos.clear();
}
else {
printf("%d %d %d\n", curmax, s[0], s[0]);
}
}
return 0;
}
#shit#
查看15道真题和解析
三奇智元机器人科技有限公司公司福利 86人发布