首页 > 代码库 > Codeforces Round #260 (Div. 1) A. Boredom (DP)
Codeforces Round #260 (Div. 1) A. Boredom (DP)
题目链接:http://codeforces.com/problemset/problem/455/A
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.
Alex is a perfectionist, so he decided to get as many points as possible. Help him.
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).
Print a single integer — the maximum number of points that Alex can earn.
2 1 2
2
3 1 2 3
4
9 1 2 1 3 2 2 2 2 3
10
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.
思路:
存下每个数的个数放在c中,消除一个数i,会获得c[i]*i的值(因为可以消除c[i]次),
如果从0的位置开始向右消去,那么,消除数i时,i-1可能选择了消除,也可能没有,
如果消除了i-1,那么i值就已经不存在,dp[i] = dp[i-1],
如果没有被消除,那么dp[i] = dp[i-2]+ c[i]*i。
代码如下:
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define LL __int64 const int MAXN = 100017; LL c[MAXN], dp[MAXN]; void init() { memset(dp,0,sizeof(dp)); memset(c,0,sizeof(c)); } int main() { LL n; LL tt; int i, j; while(~scanf("%I64d",&n)) { init(); int maxx = 0; for(i = 1; i <= n; i++) { scanf("%I64d",&tt); if(tt > maxx) maxx = tt; c[tt]++; } dp[0] = 0, dp[1] = c[1]; for(i = 2; i <= maxx; i++) { dp[i] = max(dp[i-1],dp[i-2]+c[i]*i); } printf("%I64d\n",dp[maxx]); } return 0; }