codeforces 455A
题意:
给 定 一 串 数 字 , 你 可 以 任 选 一 个 数 字 然 后 删 除 相 邻 数 字 , 并 得 到 相 应 分 数 。 问 最 大 得 分 。 给定一串数字,你可以任选一个数字然后删除相邻数字,并得到相应分数。问最大得分。 给定一串数字,你可以任选一个数字然后删除相邻数字,并得到相应分数。问最大得分。
题解:
d p [ i ] 表 示 选 择 数 字 范 围 不 超 过 i 时 的 最 大 得 分 。 dp[i]表示选择数字范围不超过i时的最大得分。 dp[i]表示选择数字范围不超过i时的最大得分。
- d p [ i ] = m a x ( d p [ i − 1 ] , d p [ i − 2 ] + n u m [ i ] ∗ i ) dp[i] = max(dp[i-1], dp[i-2]+num[i]*i) dp[i]=max(dp[i−1],dp[i−2]+num[i]∗i)
#include <bits\stdc++.h>
using namespace std;
const int N = 100001;
long long num[N];
long long dp[N];
int main()
{
int n, m = 0, x;
cin >> n;
for(int i = 1 ; i <= n ; i++){
cin >> x;
num[x]++;
m = max(m, x);
}
dp[1] = num[1]*1;
for(int i = 2 ; i <= m ; i++){
dp[i] = max(dp[i-1], dp[i-2]+num[i]*i);
}
cout << dp[m] << endl;
return 0;
}