题意:
给一个序列,里边有 n 个数,每一步能拿走一个数,比如拿第 i 个数, Ai = x,得到相应的分数 x,但拿掉这个 Ai 后,x+1 和 x-1 (如果有 Aj = x+1 或 Aj = x-1 存在) 就会变得不可拿(但是有 Aj = x 的话可以继续拿这个 x)。求最大分数。
思路:
首先我们用a数组来记录输入的数的个数,同时记录数的最大值和最小值。
f[i]=max(f[i-1]f[i-2]+i*a[i]),最后输出一个最大分数.
代码:
#include<iostream>
#include<string.h>
using namespace std;
const int maxn = 1e5 + 10;
long long a[maxn], f[maxn];
long long n, mx, mi;
long long solve()
{
f[mi - 1] = 0;
f[mi] = a[mi] * mi;
for (int i = mi + 1; i <= mx; i++)
{
long long num = f[i - 2] + a[i] * i;
f[i] = (num > f[i - 1]) ? num : f[i - 1];
}
return f[mx];
}
int main()
{
memset(a, 0, sizeof(a));
memset(f, 0, sizeof(f));
mi = 1;
mx = 1;
cin >> n;
while (n--)
{
int i;
cin >> i;
a[i]++;
if (mx < i)
mx = i;
if (mi > i)
mi = i;
}
cout << solve();
}