码迷,mamicode.com
首页 > 其他好文 > 详细

cf455a(简单dp)

时间:2016-08-07 18:43:40      阅读:356      评论:0      收藏:0      [点我收藏+]

标签:

题意:给出一个长度为n的数列,元素为a1, a2, ...an;删除ai,ai+1,ai-1 可以得到ai积分,输出最多可以得到多少积分;

题解:开一个数组a存取数列,a[i]表示元素i的个数,所以删除i可以得到a[i]*i积分;

i可以选择删除或者不删除,dp[i]表示i删除或不删除时的总积分, 如果i-1删除,则i必定删除;

若i不删除,则dp[i]=dp[i-1];

若i删除,则dp[i]=dp[i-2]+a[i]*i;

由此可得动态转移方程式:dp[i]=max(dp[i]=dp[i-1],dp[i]=dp[i-2]+a[i]*i);

代码如下:

 

#include <bits/stdc++.h>
#define MAXN 100000+10
using namespace std;

int main(void)
{
    int n, Max=0;
    long long a[MAXN], dp[MAXN];
    memset(a, 0, sizeof(a));
    memset(dp, 0, sizeof(dp));
    cin >> n;
    for(int i=0; i<n; i++)
    {
        int x;
        cin >> x;
        if(x>Max)  Max=x;
        a[x]++;
    }
    for(int i=1; i<=Max; i++)
    dp[i]=max(dp[i-1], dp[i-2]+a[i]*i);
    cout << dp[Max] <<  endl;
    return 0;
}

cf455a(简单dp)

标签:

原文地址:http://www.cnblogs.com/geloutingyu/p/5746642.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!