A. Boredom
time limit per test
1 second
memory limit per test
256 megabytes
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.
Input
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).
Output
Print a single integer — the maximum number of points that Alex can earn.
Examples
input
Copy
2
1 2
output
Copy
2
input
Copy
3
1 2 3
output
Copy
4
input
Copy
9
1 2 1 3 2 2 2 2 3
output
Copy
10
Note
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.
Em......题目我就不翻译了,,,毕竟vjudge上有大神翻译,我就直接提供思路和代码就好了
其实思路是融于代码的,哈哈哈↓↓↓↓↓
#include <stdio.h>
#include <string.h>
#define Max(x,y) x>y?x:y
#define N 100005
long long s[N];
long long dp[N];
int main() {
int n,v,max=0;
while( ~scanf( "%d",&n ) ) {
memset( s,0,sizeof(s) );
memset( dp,0,sizeof(0) );
for( int i=0 ; i<n ; i++ ) {
scanf( "%d",&v );
max = Max( max,v );
s[v]++;
}
//初始化第一个
dp[0] = s[0];
//状态转移方程:如果取得第i-1个数,那么第i-2和第i个数均不可取;反之可取得第i和第i-2个数
//即方程为dp[i] = max( dp[i-1] , s[i]*i+dp[i-2] )
//第i个状态的值为 (取得第i-1个数的得分) 与 (取得第i-2个数得分和取得当前数的得分之和) 的最大值
for( int i=1 ; i<=max ; i++ ){
dp[i] = Max( dp[i-1],s[i]*i+dp[i-2] );
}
printf( "%lld\n",dp[max] );
}
}
如果有其他想法欢迎留言交流哦