【1007 25 dp】 Maximum Subsequence Sum

传送门

题意

给定一个长度为 \(k\) 的序列,下标从 \(0\) 开始,求最大非连续子序列和以及该序列的开始元素值和终止元素值

数据范围

\(1\leq k\leq 10000\)

题解

  • iota(begin(), end(), delta), 将数组从 0 开始依次 + 1
  • vector<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];
	}
}
posted @ 2021-01-26 02:53  Hyx'  阅读(33)  评论(0)    收藏  举报