题意:每次选一个数i删除,同时所有的i-1和i+1也被删除,然后得分i。求最大得分。
解:首先这题和数字给出的顺序无关,只和i-1和i+1有关,那么可以排序。更进一步的,和有几个也无关,只和前一个后一个删不删有关,那么每个数记一下有几个。常规考虑dp[i]表示到i为止最大得分,加入i+1后试图转移,发现和i删没删有关,于是记录0/1,dp[i][0/1]表示到i,且i没删/删了最大得分,ok现在可以了。
友情提示:不开long long见祖宗。
代码:
#include<bits/stdc++.h> using namespace std; #define ll long long #define maxx 100005 #define eps 0.00000001 #define inf 0x3f //#define int long long ll num[maxx]={0}; ll dp[maxx][2]={0}; signed main() { int n; scanf("%d",&n); for(int i=0;i<n;i++){ int t; scanf("%d",&t); num[t]++; } for(int i=1;i<=100000;i++){ dp[i][1]=dp[i-1][0]+num[i]*i; dp[i][0]=max(dp[i-1][0],dp[i-1][1]); } printf("%lld\n",max(dp[100000][0],dp[100000][1])); return 0; }