牛客小白月赛30J 小游戏 dp

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;
} 
上一篇:【ybt金牌导航3-3-1】任务分配


下一篇:【CF1375F】Integer Game