题意:给出n个元素,让我们来挑选,如果选了 ak,获得ak点数,
同时与ak+1和ak?1相等的元素都要被删除,问选完所有元素后的所能获得的最大点数
思路:因为若删除i,则该数列里面的所有i都将被删除,所以只需用一个数组a[i]记录所有数a[i]表示i 出现了b次 线性dp,dp[i]表示枚举到i,要删除i的最大结果
/*
题意:给出n个元素,让我们来挑选,如果选了 ak,获得ak点数,
同时与ak+1和ak?1相等的元素都要被删除,问选完所有元素后的所能获得的最大点数
思路:因为若删除i,则该数列里面的所有i都将被删除,所以只需用一个数组a[i]记录所有不同的数,a[i]=b表示i出现了b次
线性dp,dp[i]表示枚举到i,要删除i的最大结果
*/
#include<bits/stdc++.h>
using namespace std;
#define int long long
int dp[100005];//包含删除i的最大值
int a[100005];//a[i]=b表示i出现了b次
signed main(){
int n,h;
cin>>n;
memset(a,0,sizeof(a));
for(int i=1;i<=n;i++){
scanf("%lld",&h);
a[h]++;
}
int k=0,num=0;//由于若删除i,i-1也会删除,所以用k来记录i-1之前的最大值
for(int i=1;i<100005;i++){
if(a[i]){//出现过才判断
dp[i]=a[i]*i+k;
num=max(dp[i],num);//答案是最大值
}
k=max(dp[i-1],k);
}
printf("%lld\n",num);
}