CodeForces - 455A Boredom

Posted on 2021-12-25 17:07  Capterlliar  阅读(18)  评论(0编辑  收藏  举报

题意:每次选一个数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;
}
View Code