前面的大佬竟然一句话都没有说,直接发代码了,对蒟蒻(包括我)有点不友好,所以我来发一个带讲解的版本awa
代码里说的很明白啦,再有不会的可以评论区问(喜欢的话请点个赞支持一下吧)
#include <bits/stdc++.h>
using namespace std;
#define sc second
#define fr first
#define int long long
const int mod = 998244353;
int n, m, num, cnt = 0, l = 1, r = 1e10;
string s;
void _()
{
cin >> n;
vector<int> a(2 * n + 5);
vector<int> q(2 * n + 5); // 前缀和数组
vector<int> start(2 * n + 5); // 记录每个数字第一次出现的位置
vector<int> dp(2 * n + 5); // dp数组:到位置i为止的最高得分
for (int i = 1; i <= 2 * n; i++)
{
cin >> a[i];
q[i] = q[i - 1] + a[i]; // 计算前缀和
if (start[a[i]]) // 如果这个数字之前出现过(现在是第二次出现)
{
// 选择删除以这对数字为端点的区间
// dp[start[a[i]] - 1]: 在这个区间开始之前的最佳得分
// q[i] - q[start[a[i]] - 1]: 这个区间的和
dp[i] = dp[start[a[i]] - 1] + q[i] - q[start[a[i]] - 1];
}
else
{
start[a[i]] = i; // 记录第一次出现的位置
}
// 不选择以当前位置为右端点的区间
dp[i] = max(dp[i], dp[i - 1]);
}
cout << dp[2 * n] << endl;
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
int awa = 1;
// cin >> awa;
while (awa--)
{
_();
}
return 0;
}

京公网安备 11010502036488号