zoukankan      html  css  js  c++  java
  • CodeForces 455A Boredom (DP)

    Boredom

    题目链接:

    http://acm.hust.edu.cn/vjudge/contest/121334#problem/G

    Description

    Alex doesn't like boredom. That's why whenever he gets bored, he comes up with games. One long winter evening he came up with a game and decided to play it.

    Given a sequence a consisting of n integers. The player can make several steps. In a single step he can choose an element of the sequence (let's denote it ak) and delete it, at that all elements equal to ak + 1 and ak - 1 also must be deleted from the sequence. That step brings ak points to the player.

    Input

    The first line contains integer n (1 ≤ n ≤ 105) that shows how many numbers are in Alex's sequence.

    The second line contains n integers a1, a2, ..., an (1 ≤ ai ≤ 105).

    Output

    Print a single integer — the maximum number of points that Alex can earn.

    Sample Input

    Input
    2
    1 2
    Output
    2
    Input
    3
    1 2 3
    Output
    4
    Input
    9
    1 2 1 3 2 2 2 2 3
    Output
    10

    Hint

    Consider the third test example. At first step we need to choose any element equal to 2. After that step our sequence looks like this [2, 2, 2, 2]. Then we do 4 steps, on each step we choose any element equals to 2. In total we earn 10 points.


    ##题意: 给出n个数,每次任意选择其中一个数Ai: 删除Ai(一个)以及所有的Ai-1 Ai+1; 此次删除操作得分为Ai; 问删除所有元素最多可以获得多少分.
    ##题解: 由于数组元素的范围是10^5,故可以排序后直接DP: dp[i][0/1]分别表示删除i或不删除(由其他数删掉)所获得的最大分数. 转移方程: dp[i][0] = max(dp[i-1][0], dp[i-1][1]); dp[i][1] = dp[i-1][0] + cnt[i]*i;
    ##代码: ``` cpp #include #include #include #include #include #include #include #include #include #define LL long long #define eps 1e-8 #define maxn 101000 #define mod 100000007 #define inf 0x3f3f3f3f #define IN freopen("in.txt","r",stdin); using namespace std;

    int n;
    int cnt[maxn];
    LL dp[maxn][2];

    int main(int argc, char const *argv[])
    {
    //IN;

    while(scanf("%d", &n) != EOF)
    {
        memset(cnt, 0, sizeof(cnt));
        for(int i=1; i<=n; i++) {
            int x; scanf("%d", &x);
            cnt[x]++;
        }
    
        memset(dp, 0, sizeof(dp));
        for(int i=1; i<=100000; i++) {
            dp[i][0] = max(dp[i-1][0], dp[i-1][1]);
            dp[i][1] = dp[i-1][0] + (LL)(cnt[i])*(LL)(i);
        }
    
        LL ans = max(dp[100000][0], dp[100000][1]);
        printf("%I64d
    ", ans);
    }
    
    return 0;
    

    }

  • 相关阅读:
    apple苹果产品国行和港行的区别
    iOS ifdef ifndef endif
    objectiveC【语法】修饰符 static extern const
    iOS关于Xcode上的Other linker flags
    win7 64位旗舰版下载
    关于ios 和 android 录音(语音)对聊文件格式问题
    关于 NSData 的数据类型(2进制,16进制之间)及深入剖析
    iOS调用系统相册、相机 显示中文标题
    xcode各个版本下载 xcode7 xcode6 xcode5
    IOS开发之----全局变量extern的使用
  • 原文地址:https://www.cnblogs.com/Sunshine-tcf/p/5701877.html
Copyright © 2011-2022 走看看