Codeforces 260 C. Boredom

题目链接:http://codeforces.com/contest/456/problem/C

解题报告:给出一个序列,然后选择其中的一个数 k 删除,删除的同时要把k - 1和k + 1也删除掉,同时总分数里面加上一个k,求最大的分数可以是多少?

dp题,递推公式是  dp[i] = max(dp[i-2]+num[i] * i,dp[i-1]);  ,注意要用long long ,一开始没用WA了两发。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 #include<cmath>
 6 #include<deque>
 7 #include<queue>
 8 #include<set>
 9 #include<map>
10 using namespace std;
11 #define maxn 100005
12 #define LL long long
13 LL dp[maxn],num[maxn];
14 
15 int main()
16 {
17     int n;
18     while(scanf("%d",&n)!=EOF)
19     {
20         memset(num,0,sizeof(num));
21         memset(dp,0,sizeof(dp));
22         LL d,M = 0;
23         for(int i = 1;i <= n;++i)
24         {
25             scanf("%lld",&d);
26             M = max(M,d);
27             num[d]++;
28         }
29         dp[1] = num[1];
30         for(int i = 2;i <= M;++i)
31         dp[i] = max(dp[i-2]+num[i] * i,dp[i-1]);
32         printf("%lld\n",dp[M]);
33     }
34     return 0;
35 }
View Code

 

posted @ 2014-08-10 21:53  xiaxiaosheng  阅读(214)  评论(0编辑  收藏  举报