标签:nbsp red cout 链接 bsp names its with problems
题目链接: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]
标签:nbsp red cout 链接 bsp names its with problems
原文地址:https://www.cnblogs.com/dilthey/p/10527623.html