Alex doesn't like boredom. That's why whenever he gets bored, he comes up with games. One long winter evening he came up with a game and decided to play it.
Given a sequence a consisting of n integers. The player can make several steps. In a single step he can choose an element of the sequence (let's denote it ak) and delete it, at that all elements equal to ak + 1 and ak - 1 also must be deleted from the sequence. That step brings ak points to the player.
Alex is a perfectionist, so he decided to get as many points as possible. Help him.
The first line contains integer n (1 ≤ n ≤ 105) that shows how many numbers are in Alex's sequence.
The second line contains n integers a1, a2, ..., an (1 ≤ ai ≤ 105).
Print a single integer — the maximum number of points that Alex can earn.
2 1 2
2
3 1 2 3
4
9 1 2 1 3 2 2 2 2 3
10
Consider the third test example. At first step we need to choose any element equal to 2. After that step our sequence looks like this[2, 2, 2, 2]. Then we do 4 steps, on each step we choose any element equals to 2. In total we earn 10 points.
一道DP题,自己写的总是跪在12个样例
12个样例的测试数据是100,000,导致我差错也差不了
我的想法是用a[i]存储i出现的次数与i的乘积
因为每相邻两项总要取其中一项,所以有a[i] += max(a[i-2], a[i-3])
比如:1 2 3 4 5 6
可以选取:
1 3 5
1 3 6
1 4 6
2 4 6
循环遍历如果有a[i]!=0,则取a[i] += max(a[i-2], a[i-3]);
结果错了,想不通怎么回事
先附上正确的答案吧:
#include <cstdio>
#include <iostream>
#define MAXN 100100
#define LL long long
using namespace std;
LL n, k, a[MAXN];
int main(void) {
cin >> n;
for(LL i=0; i<n; ++i) {
cin >> k;
a[k]++;
}
//a[i]表示前i个回合得分最大值
for(LL i=2; i<100001; ++i) {
a[i] = max(a[i-2]+i*a[i], a[i-1]);//要或不要第i-1项
//cout << "a[" << i << "] = " << a[i] << endl;
}
cout << a[100000] << endl;
return 0;
}