题意:给定n<1e5个数,从n个数里选数,每选一个k,得到k分,删除所有k+1和k-1,使得分最高。
dp[i][0]表示第i个数不选,dp[i][1]表示选。最优情况一定是把所有数都用完。
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
int a[100010];
int cnt[100010];
long long d[100010][5];
int main()
{
int i,j,k,n,m;
while(scanf("%d",&n)!=EOF)
{
memset(cnt,0,sizeof(cnt));
int ma=-1;
for(i=0;i<n;i++){
scanf("%d",&a[i]);
ma=max(ma,a[i]);
cnt[a[i]]++;
}
d[1][1]=cnt[1];d[1][0]=0;
for(i=2;i<=ma;i++)
{
d[i][1]=d[i-1][0]+1LL*cnt[i]*i;
d[i][0]=max(d[i-1][1],d[i-1][0]);
}
printf("%I64d\n",max(d[ma][0],d[ma][1]));
// d[1]=cnt[1];d[0]=0;
// for(i=2;i<=ma;i++)
// {
// d[i]=max(d[i-1],d[i-2]+1ll*cnt[i]*i);
// }
//
// printf("%I64d\n",d[ma]);
}
}