列表

详情


NC214364. 小游戏

描述

有一个长度为 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 )。求最大分数。

输入描述

第一行一个整数 n. ( 1 ≤ n ≤ 2e5)

第二行 n 个整数 a[i]. (0 ≤ a[i] ≤ 2e5)

输出描述

输出能得到的最大分数。


示例1

输入:

5
1 2 2 2 3

输出:

6

说明:

拿走 3 个 2

示例2

输入:

3
1 2 3

输出:

4

说明:

拿走 1 和 3

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(clang++11) 解法, 执行用时: 61ms, 内存消耗: 4728K, 提交时间: 2021-02-28 21:23:48

#include <iostream>
using namespace std;
long long a[200005],dp[200005];
int main() {
	int n;
	cin >> n;
	for(int i=1;i<=n;i++)
	{
		int x;
		cin >> x;
		a[x]+=x;
	}
	for(int i=1;i<=200000;i++)
		dp[i]=max(dp[i-1],dp[max(0,i-2)]+a[i]);
	cout << dp[200000];
	return 0;
}

上一题