Codeforces 455A - Boredom - [DP]

Posted dilthey

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces 455A - Boredom - [DP]相关的知识,希望对你有一定的参考价值。

题目链接:https://codeforces.com/problemset/problem/455/A

 

题意:

给出一个 $n$ 个数字的整数序列 $a[1 sim n]$,每次你可以选择一个 $a[k]$ 将其删除,同时还会删除序列中所有等于 $a[k] + 1$ 和 $a[k] - 1$ 的元素。

每做这样一次操作,你可以获得 $a[k]$ 的分数,求可以得到的最大分数。

 

题解:

首先,看到 $a[1 sim n]$ 的取值最大不超过 $1e5$,就应当想到在这个上面做文章。

$f[x][0]$ 表示:值为 $x$ 的元素全部删除,并获得相应的分数,此时能获得的最大分数。

$f[x][1]$ 表示:值为 $x$ 的元素不删除(或者无法删除),不能获得相应分数,此时能获得的最大分数。

 

AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
int n,a[maxn],c[maxn];
ll f[maxn][2];
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i], c[a[i]]++;

    f[1][0]=1ll*c[1], f[1][1]=0;
    for(int x=2;x<maxn;x++)
    {
        f[x][0]=f[x-1][1]+(ll)x*c[x];
        f[x][1]=max(f[x-1][0],f[x-1][1]);
    }

    cout<<max(f[100000][0],f[100000][1])<<endl;
}

 

以上是关于Codeforces 455A - Boredom - [DP]的主要内容,如果未能解决你的问题,请参考以下文章

Boredom CodeForces - 455A

Codeforces 455A - Boredom - [DP]

cf455A boredom

CF 455A Boredom

cf 455A Boredom (dp)

(补题 CF 455A)Boredom(DP)