题目大意:给定一个序列,每次从序列中选中一个数ak,获得ak的得分,同时删除序列中所有的ak−1,ak+1,求最大得分。
题目
分析:
dp[i]表示以i结尾的最大得分。
那么dp[i]=max(dp[i-1],dp[i-2]+num[i]*i);
#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
using namespace std;
#define inf 0x3f3f3f3f
#define For(a,b) for(int a=0;a<b;a++)
#define mem(x) memset(x,0,sizeof(x))
#define Debug(x) cout<<"---> "<<x<<endl;
#define sf scanf
#define pf printf
int gcd(int a,int b){ return b>0?gcd(b,a%b):a;}
typedef long long ll;
typedef pair<int ,int > PII;
//head
#define maxn 300010
ll n,dp[maxn],A[maxn],num[maxn],Max=-inf;
int main(){
cin>>n;
for(int i=0;i<n;i++){
cin>>A[i];
num[A[i]]++;
Max=max(Max,A[i]);
}
dp[0]=0;
dp[1]=num[1]*1;
for(int i=2;i<=Max;i++){
dp[i]=max(dp[i-1],dp[i-2]+num[i]*i);
}
cout<<dp[Max]<<endl;
return 0;
}