题目大意:一个数列,每次可以去掉一个值为a的数,同时也会删掉所有值为a-1,a+1的数。这样一个操作得到a分,问把这个数列清空则最多可得到多少分
分析:
对于值为i的数,只有选或不选两种可能。
令d[i][1]等于选择值为i的数可以得到的最大分数。
d[i][0]为不选择可以得到的最大分数。
num[i]表示值为i的数量。
则
d[i][1]=d[i-1][0]+num[i]*i;
d[i][0]=max(d[i-1][1],d[i-1][0]);
注意可能会超int
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
#include <vector>
#include<map>
#define pi acos(-1.0)
#define eps 1e-6
#define inf 1<<30
#define INF 1ll<<60
#define ll long long
using namespace std;
int n;
int a[110000];
int num[110000];
ll d[110000][2];
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
for(int i=0;i<n;i++)
{
num[a[i]]++;
}
d[1][1]=1*num[1];
d[1][0]=0;
for(int i=2;i<=100000;i++)
{
d[i][1]=d[i-1][0]+(ll)num[i]*i;
d[i][0]=max(d[i-1][1],d[i-1][0]);
}
cout<<max(d[100000][1],d[100000][0])<<endl;
return 0;
}