1 条题解

  • 0
    @ 2024-10-31 16:12:26

    分析

    tag:DP

    本质就是删除v1v-1vvv+1v+1获得cnt[v]vcnt[v]*v的价值,我们记录出现的最大数字maxxmaxx,并且用valval数组存删掉vv的价值,从11~maxxmaxx进行DPDP,对于当前最优解有两种状态:删上一个或者删上上个,删上一个的最优解就是dp[i1]dp[i-1],删上上个的最优解就是dp[i2]dp[i-2] + val[i]val[i],状态转移如下:

    • dp[0]=0dp[0] = 0
    • i < 2 : dp[i]=max(dp[i1],val[i])dp[i] = max(dp[i-1], val[i])
    • i >= 2: dp[i]=max(dp[i1],dp[i2]+val[i])dp[i] = max(dp[i-1], dp[i-2] + val[i])

    参考代码

    #include <bits/stdc++.h>
    
    using namespace std;
    const int N = 1e6 + 5;
    long long dp[N];
    long long val[N];
    int main() {
        int n;
        scanf("%d", & n);
        vector < int > elements(n);
        for (int i = 0; i < n; i++) {
            scanf("%d", & elements[i]);
        }
        int maxx = 0;
        for (auto it: elements) {
            val[it] += it;
            maxx = max(maxx, it);
        }
        long long ans = 0;
        for (int i = 1; i <= maxx; ++i) {
            dp[i] = max(dp[i - 1], (i < 2 ? 0 : dp[i - 2]) + val[i]);
            ans = max(ans, dp[i]);
        }
        printf("%lld\n", ans);
        return 0;
    }
    
    
    • 1

    信息

    ID
    18
    时间
    1000ms
    内存
    256MiB
    难度
    3
    标签
    递交数
    6
    已通过
    5
    上传者