【1007 25 dp】 Maximum Subsequence Sum
传送门
题意
给定一个长度为 \(k\) 的序列,下标从 \(0\) 开始,求最大非连续子序列和以及该序列的开始元素值和终止元素值
数据范围
\(1\leq k\leq 10000\)
题解
iota(begin(), end(), delta), 将数组从0开始依次+ 1vector<int> a(x.begin(), x.end()),将a元素依次赋值为x中的元素dp[i]记录以下标i结尾的最大子序列和值,l[i]记录其对应的左端点,二者一同更新- 最后找到
dp中的最大值即可 - 判断最大值是否小于
0,小于则输出0和数组的首元素和尾元素即可
Code
#include <bits/stdc++.h>
using namespace std;
int main() {
int k; cin >> k;
vector<int> a(k);
for (auto& x : a) {
cin >> x;
}
vector<int> dp(a.begin(), a.end()), l(k);
iota(l.begin(), l.end(), 0);
for (int i = 1; i < k; ++i) {
if (dp[i] <= dp[i - 1] + a[i]) {
dp[i] = dp[i - 1] + a[i];
l[i] = l[i - 1];
}
}
int ans = max_element(dp.begin(), dp.end()) - dp.begin();
if (dp[ans] < 0) {
cout << 0 << ' ' << a[0] << ' ' << a.back();
} else {
cout << dp[ans] << ' ' << a[l[ans]] << ' ' << a[ans];
}
}

浙公网安备 33010602011771号