动态规划问题。
先做一个哈希,统计一下每个点数的个数p[i]。
dp[i]表示到i为止得到的最大点数
递推关系:
1.选择 i :选 i 就不能选择 i -1 , dp[i] = dp[i-2] + p[i] * i;
2.不选择 i : dp[i] = dp[i-1];
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn = 100005;
ll p[maxn],dp[maxn];
int main(){
ll i , n , x , maxn = -1;
memset(p,0,sizeof(p));
memset(dp,0,sizeof(dp));
scanf("%I64d", &n);
for(i = 1 ; i <= n ; i++){
scanf("%I64d", &x);
if(x > maxn)
maxn = x ;
p[x]++ ;
}
dp[1] = p[1] ;
for(i = 2 ; i <= maxn ; i++)
dp[i] = max( dp[i-1],dp[i-2]+p[i]*i );
printf("%I64d\n", dp[maxn]);
return 0;
}