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.
题意:给你一个序列,你可以选择一个ak消去它,然后得到ak的点数,但是序列中所有的ak+1,ak-1都会消去
思路:刚开始读错了题目,以为是消去左右两个数。。
每个数字有两种状态,消去或者选取,如果选取,那么可以选cnt[ak]次
那么方程就是dp[i]=max(dp[i-1],dp[i-2]+cnt[i]*i)
ac代码:
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stack>
#include<set>
#include<queue>
#include<vector>
#include<iostream>
#include<algorithm>
#define MAXN 1010000
#define LL long long
#define ll __int64
#define INF 0x7fffffff
#define mem(x) memset(x,0,sizeof(x))
#define PI acos(-1)
#define eps 1e-8
using namespace std;
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
ll powmod(ll a,ll b,ll MOD){ll ans=1;while(b){if(b%2)ans=ans*a%MOD;a=a*a%MOD;b/=2;}return ans;}
double dpow(double a,ll b){double ans=1.0;while(b){if(b%2)ans=ans*a;a=a*a;b/=2;}return ans;}
//head
ll dp[MAXN];
ll cnt[MAXN];
int main()
{
int n,i;
while(scanf("%d",&n)!=EOF)
{
ll mi=INF,M=-INF;
mem(cnt);
for(i=1;i<=n;i++)
{
ll a;
scanf("%I64d",&a);
M=max(M,a);
cnt[a]++;
}
mem(dp);
dp[1]=cnt[1];
for(i=2;i<=M+1;i++)
{
dp[i]=max(dp[i-1],dp[i-2]+cnt[i]*i);
}
printf("%I64d\n",dp[M]);
}
return 0;
}