题目的大意是:给定你一个数组,每次可以删掉一个大小为a的数,获得a的分数,同时删除数列中所有大小为a+1和a-1的数。问删除所有数组中的数后,能够获得的最大分数值。
思路:本题可以用线性dp来解决。dp[n]表示的含义如下:
在不考虑是否删除大小为n的数的情况下,可以获得的最大分数值(一定要注意前提条件)。那么有两种情况。一是删除大小为n-1的数,那么大小为n的数也被删除了,此时
dp[n]=dp[n-2]+num[n-1]*(n-1)
情况二是不删除大小为n-1的数,此时
dp[n]=dp[n-1]
因此状态转移方程可以表示为
dp[n]=max(dp[n-1],dp[n-2]+num[n-1]*(n-1))
以下是AC代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn =1e5+10;
map<ll, ll>mp;
ll dp[maxn];
void solve()
{
int n;
int num;
cin >> n;
int mx = 0;
for (int i = 1; i <= n; i++)
{
cin >> num;
mx = max(mx, num);
mp[num]++;
}
dp[1] = mp[1];
for (int i = 2; i <= mx; i++)
{
dp[i] = max(dp[i - 1], dp[i - 2] + mp[i] * i);
}
cout << dp[mx] << endl;
}
int main()
{
//int t;
//cin >> t;
//while (t--)
//{
solve();
//}
}