J dp B站讲解视频 https://www.bilibili.com/video/BV1GT4y1M78d?p=5
#include<bits/stdc++.h> using namespace std; typedef long long ll; //typedef __int128 INT; typedef double db; typedef vector<int> vii; typedef vector<ll> vll; typedef pair<int,int> PII; #define so sizeof #define pb push_back #define pf push_front #define ppb pop_back #define ppf pop_front #define fi first #define se second #define mp make_pair #define ub upper_bound const db esp=1e-5; const int N=2e5+10,M=2e5+10,Max=2e5,inf=0x3f3f3f3f,mod=998244353; const ll INF=0x3f3f3f3f3f3f3f3f; int n,a; ll num[N],dp[N][2]; void work(){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&a); num[a]++; } for(int i=1;i<=Max;i++){ dp[i][0]=max(dp[i-1][1],dp[i-1][0]); dp[i][1]=dp[i-1][0]+num[i]*i; } cout<<max(dp[Max][0],dp[Max][1])<<endl; return ; } int main(){ work(); return 0; }