https://ac.nowcoder.com/acm/contest/9667/J
题意:
有一个长度为 n 的数组 a[i] , 每一步能拿走一个数,比如拿第 i 个数, a[i] = x ,得到相应的分数 x ,但拿掉这个 x 后, x+1 和 x-1 (如果有 a[j] = x+1 或 a[j] = x-1 存在) 就会变得不可拿(但是有 a[j] = x 的话可以继续拿这个 x )。求最大分数。
题解:显然我们只用关注数值,不妨把数值相同的加在一起。然后令f[n]为1-n不能选相邻的最大值。简单的推一下就可以看出。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+10;
ll f[N],a[N];
int n;
int main(){
scanf("%d",&n);
ll mm=0;
for(int i=1;i<=n;i++) {
ll x;
scanf("%lld",&x);
a[x]+=x;
mm=max(mm,x);
}
f[1]=a[1];
f[2]=a[2];
for(int j=3;j<=mm;j++){
f[j]=max(f[j-1],f[j-2]+a[j]);
}
printf("%lld\n",f[mm]);
return 0;
}