Files
2025-11-06 12:15:56 -03:00

37 lines
754 B
C++

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
/*
pick a number and gain n[i] points
delete all numbers equal to n[i] - 1 and n[i] + 1
the maximum that I can get in number n[i] is
max (dp[i - 1], dp[i - 2] + points(i))
*/
ll deleteAndEarn(vector<int>& nums) {
unordered_map<int, int> freq;
int maxN = INT_MIN;
for (int i : nums) {
maxN = max(maxN, i);
freq[i]++;
}
int N = maxN;
vector<ll> dp(N + 1, 0);
dp[1] = freq[1];
for (int i = 2; i <= N; i++) {
dp[i] = max(freq[i] * i + dp[i - 2], dp[i - 1]);
}
return dp[N];
}
int main(){
int n; cin >> n;
vector<int> nums(n);
for (int i = 0; i < n; i++) cin >> nums[i];
cout << deleteAndEarn(nums) << endl;
return 0;
}