题目连接:http://codeforces.com/contest/455/problem/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.
题目大意:有n个数,选择一个(设为ak)删除可以得ak分,但是数列中所有等于ak+1或ak-1的数必须删去,求最多可以得多少分。
很典型的dp题目,我比较菜所以状态设置为比较好理解的 dp[i][0]代表不选i的最大值,dp[i][1]代表选i得到的最大值。
转移方程就很好写了,边界也很清晰,详见代码
#include<bits/stdc++.h> using namespace std; typedef long long LL; LL dp[100005][2]; LL c[100005]={0}; int main() { int n; int in; int z=0; cin>>n; for(int i=0;i<n;i++) { scanf("%d",&in); c[in]++; z=max(z,in); } memset(dp,0,sizeof(dp)); for(int i=1;i<=z;i++) { dp[i][1]=dp[i-1][0]+c[i]*LL(i); dp[i][0]=max(dp[i-1][0],dp[i-1][1]); } cout<<max(dp[z][0],dp[z][1]); }