Codeforces Round #260 (Div. 1) A. Boredom

Boredom

在这里插入图片描述
首先可以发现一个性质,如果要选一个数,就一定是全部选完,因为选择第二个的时候不会再删掉数字了,所以只会使得答案变得更优,但如果不删就只会使得答案变得更劣。

我们定义: d p [ i ] dp[i] dp[i] 为最大值限制为 i i i 的所有数字进行操作,所能得到的最大值。那么对于 d p [ i ] dp[i] dp[i] 来说,我们要么一开始直接选完 i i i ,要么使得它被其他数字删除。

那么先考虑第一种情况:我们要选择 i i i ,那么首先肯定可以获得 c n t [ i ] × i cnt[i]×i cnt[i]×i 的分数,而后 i − 1 i-1 i1 必然被删除,所以剩余的极大值就是 d p [ i − 2 ] dp[i-2] dp[i2] ,所以此情况的最大值就是 c n t [ i ] × i + d p [ i − 2 ] cnt[i]×i+dp[i-2] cnt[i]×i+dp[i2]

第二种情况:使得其被删除,那么考虑 d p [ i − 1 ] dp[i-1] dp[i1] (只有其可以删除 i i i ),如果其最大值是用了 i − 1 i-1 i1 所得到的,那么自然答案自然为 d p [ i − 1 ] dp[i-1] dp[i1] ,让若不是,那么我们也可以 d p [ i − 1 ] dp[i-1] dp[i1] 和第一种情况取 m a x max max ,必定可以得到正解。

综上, d p [ i ] = m a x ( c n t [ i ] × i + d p [ i − 2 ] , d p [ i − 1 ] ) ( i ≥ 2 ) dp[i]=max(cnt[i]×i+dp[i-2],dp[i-1])(i≥2) dp[i]=max(cnt[i]×i+dp[i2],dp[i1])(i2)

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const int N = 1e5 + 10;

int n;

ll cnt[N], a[N], dp[N];

int main() {
#ifndef ONLINE_JUDGE
    freopen("in.txt", "r", stdin);
    freopen("out.txt", "w", stdout);
#endif
    cin >> n;
    for (int i = 1; i <= n; ++i) {
        cin >> a[i];
        cnt[a[i]]++;
    }
    dp[1] = cnt[1];
    for (ll i = 2; i <= 100000; ++i) {
        dp[i] = max(i * cnt[i] + dp[i - 2], dp[i - 1]);
    }
    printf("%lld", dp[100000]);
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值