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;
    

    }

  • 相关阅读:
    支持向量机SVM知识点概括
    决策树知识点概括
    HDU 3081 Marriage Match II
    HDU 3572 Task Schedule
    HDU 4888 Redraw Beautiful Drawings
    Poj 2728 Desert King
    HDU 3926 Hand in Hand
    HDU 1598 find the most comfortable road
    HDU 4393 Throw nails
    POJ 1486 Sorting Slides
  • 原文地址:https://www.cnblogs.com/Sunshine-tcf/p/5701877.html
Copyright © 2011-2022 走看看