Codeforces Round #260 (Div. 2)C. Boredom

来源:互联网 发布:培训环节知乎 编辑:程序博客网 时间:2024/05/22 02:11

动态规划问题。

先做一个哈希,统计一下每个点数的个数p[i]。

dp[i]表示到i为止得到的最大点数

递推关系:

1.选择 i :选 i 就不能选择 i -1 , dp[i] = dp[i-2] + p[i] * i;

2.不选择 i : dp[i] = dp[i-1];

#include <cstdio>#include <cstring>#include <algorithm>using namespace std;typedef long long ll;const int maxn = 100005;ll p[maxn],dp[maxn];int main(){    ll i , n , x , maxn = -1;    memset(p,0,sizeof(p));    memset(dp,0,sizeof(dp));    scanf("%I64d", &n);    for(i = 1 ; i <= n ; i++){        scanf("%I64d", &x);        if(x > maxn)            maxn = x ;        p[x]++ ;    }    dp[1] = p[1] ;    for(i = 2 ; i <= maxn ; i++)        dp[i] = max( dp[i-1],dp[i-2]+p[i]*i );    printf("%I64d\n", dp[maxn]);    return 0;}


0 0
原创粉丝点击