题意介绍
给一个序列,里边有 n 个数,每一步能拿走一个数,比如拿第 i 个数, Ai = x,得到相应的分数 x,但拿掉这个 Ai 后,x+1 和 x-1 (如果有 Aj = x+1 或 Aj = x-1 存在) 就会变得不可拿(但是有 Aj = x 的话可以继续拿这个 x)。求最大分数。
题意分析
用sum数组记录每一个数出现的次数,dp[i]记录取小于等于i的数时的最大分数。
状态转移方程为:
dp[i] = max(dp[i - 1], dp[i - 2] + i * sum[i]);
通过代码
#include<bits/stdc++.h>
using namespace std;
long long n,a, sum[200000],mn,mx;
long long ans, dp[200000];
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a;
mn = min(a, mn);
mx = max(a, mx);
sum[a]++;
}
dp[mn] = mn * sum[mn];
for (int i = mn; i <= mx; i++)
dp[i] = max(dp[i - 1], dp[i - 2] + i * sum[i]);
cout << dp[mx] << endl;
return 0;
}