题解 | 小红的双排列删除得分

小红的双排列删除得分

https://www.nowcoder.com/practice/936b2a6a94bc43f6a79b74025b93f944

前面的大佬竟然一句话都没有说,直接发代码了,对蒟蒻(包括我)有点不友好,所以我来发一个带讲解的版本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;
}

全部评论
还是能在榜上留名的优解吗?恐怖如斯。
2 回复 分享
发布于 01-31 17:01 湖北
居然是有文字的题解,99成,稀罕物。
2 回复 分享
发布于 01-31 16:58 湖北
1
点赞 回复 分享
发布于 03-21 21:19 山东

相关推荐

牛客你可姐:第一眼100-200虽然低……第二眼周?周?周吗?
点赞 评论 收藏
分享
04-27 15:01
早稲田大学 Java
牛客72191338...:可能是时间点的问题,四月底机会确实会相对少点,但佬这个学历摆在这,会有机会的
简历中的项目经历要怎么写
点赞 评论 收藏
分享
评论
13
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务