#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
#include<map>
#include<unordered_map>
#include<string>
using namespace std;
/*
题意:求最大连续的子序列和,并输出第一个和最后一个数字如果相等则输出最小的索引
分析:可以用动态规划求解,dp[i]表示以第i位结尾的前面的子序列和最大值
有方程如dp[i] = max{dp[i-1]+a[i],a[i]};
*/
int main() {
int n;
cin >> n;
vector<int> dp(n), a(n);
for (int i = 0; i < n; ++i) scanf("%d", &a[i]);
dp[0] = a[0];
for (int i = 1; i < n; ++i) dp[i] = max(a[i],a[i]+dp[i-1]);
int ed=0,st=0;
for (int i = 1; i < n; ++i) {
if (dp[ed] < dp[i]) {
ed = i;
}
}
for (int i = ed; i >= 0; --i) {
if (dp[i] < 0) {
st = i + 1;
break;
}
}
if (dp[ed] < 0) printf("0 %d %d", a[0], a[n - 1]);
else printf("%d %d %d", dp[ed], a[st], a[ed]);
return 0;
}
pat甲级1007
最新推荐文章于 2022-06-12 00:02:02 发布