题意:
给出n个值,给出一个规则,如果删除ak那么ak+1,ak-1這些数都没掉,但是会得到ak*(ak的个数)的分数值,那么如何删除数使得总值最大。
分析:
其是可以抽象成最大不连续和的问题。
dp[i]=max(dp[i-1],dp[i-2]+num[i]*i);
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<math.h>
using namespace std;
typedef long long lld;
#define oo 0x3f3f3f3f
#define maxn 100000+5
lld dp[maxn],num[maxn];
int main()
{
int n,val;
while(scanf("%d",&n)!=EOF)
{
memset(dp,0,sizeof dp);
memset(num,0,sizeof num);
for(int i=1;i<=n;i++)
{
scanf("%d",&val);
num[val]++;
}
for(int i=1;i<maxn;i++)
dp[i]=max(dp[i-1],dp[i-2]+num[i]*i);
cout<<dp[maxn-1]<<endl;
}
return 0;
}