原题目:
f[i][0] 表示前i个数但是i不选的最大结果
f[i][1] 表示前i个数并且i选上的最大结果
对于每一个数字 t:
1、如果选了 t ,则 t - 1 一定不选
2、如果没有选择 t ,则 f[i][0] = max(f[i - 1][0],f[i - 1][1])
AC代码:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define sf(x) scanf("%d", &x);
#define de(x) cout << x << " ";
#define Pu puts("");
const int N = 1e5 + 10, M = 1e5;
int n, m;
ll cnt[N];
ll f[N][2];
int main() {
cin >> n;
int x;
for (int i = 1; i <= n; i++) {
sf(x);
cnt[x]++;
}
for (ll i = 1; i <= M; i++) {
f[i][1] = f[i - 1][0] + cnt[i] * i;
f[i][0] = max(f[i - 1][1], f[i - 1][0]);
}
de(max(f[M][0], f[M][1]));
}