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;
}

猜你喜欢

转载自www.cnblogs.com/dilthey/p/10527623.html