PAT 1007 Maximum Subsequence Sum 25 分
这是一个动态规划的题目,思想还是比较简单的。题意是求一个序列的最大连续子列和,下面给一下递推方程:
当
d
p
[
i
−
1
]
+
n
u
m
[
i
]
>
=
0
dp[i-1] + num[i] >= 0
dp[i−1]+num[i]>=0 的时候
d
p
[
i
]
=
d
p
[
i
−
1
]
+
n
u
m
[
i
]
dp[i] = dp[i-1] + num[i]
dp[i]=dp[i−1]+num[i] ,题目还有一个要求是让你记录这个子列的首末元素,详见代码部分。
这篇博文我主要想记录一下坑点:
1、如果一组数据里最大值是0,你必须能够返回0和这个0的位置。
2、一定要考虑仅有一个元素的情况
总的来说就是要考虑一些比较边界的情况。
// An highlighted block
#include<bits/stdc++.h>
using namespace std;
int main() {
int N;
cin >> N;
vector<int> num(N);
for (int i = 0; i < N; ++i) {
cin >> num[i];
}
vector<int> dp(N, 0);
dp[0] = max(0, num[0]);
int left = 0;
int right = 0;
int aL = 0, aR = N - 1;
int ans = -1;
for (int i = 1; i<N; ++i) {
if (dp[i - 1] + num[i] > -1) {
dp[i] = dp[i - 1] + num[i];
right = i;
if (ans < dp[i]) {
ans = dp[i];
aL = left + 1;
aR = right;
}
}
else {
left = i;
}
}
if (N >= 2) {
if (ans == -1) {
cout << 0 << " " << num[aL] << " " << num[aR] << endl;
}
else cout << ans << " " << num[aL] << " " << num[aR] << endl;
}
else {
if (num[0] > 0) {
cout << num[0] << " " << num[aL] << " " << num[aR] << endl;
}
else cout << 0 << " " << num[aL] << " " << num[aR] << endl;
}
//system("pause");
return 0;
}