CodeForces 455A Boredom (DP)
2016-07-24 22:47
387 查看
Boredom
题目链接:
http://acm.hust.edu.cn/vjudge/contest/121334#problem/GDescription
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.
Input
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).
Output
Print a single integer — the maximum number of points that Alex can earn.Sample Input
Input2
1 2
Output
2
Input
3
1 2 3
Output
4
Input
9
1 2 1 3 2 2 2 2 3
Output
10
Hint
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.题意:
给出n个数,每次任意选择其中一个数Ai:删除Ai(一个)以及所有的Ai-1 Ai+1; 此次删除操作得分为Ai;
问删除所有元素最多可以获得多少分.
题解:
由于数组元素的范围是10^5,故可以排序后直接DP:dp[i][0/1]分别表示删除i或不删除(由其他数删掉)所获得的最大分数.
转移方程:
dp[i][0] = max(dp[i-1][0], dp[i-1][1]);
dp[i][1] = dp[i-1][0] + cnt[i]*i;
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <queue> #include <map> #include <set> #include <vector> #define LL long long #define eps 1e-8 #define maxn 101000 #define mod 100000007 #define inf 0x3f3f3f3f #define IN freopen("in.txt","r",stdin); using namespace std; int n; int cnt[maxn]; LL dp[maxn][2]; int main(int argc, char const *argv[]) { //IN; while(scanf("%d", &n) != EOF) { memset(cnt, 0, sizeof(cnt)); for(int i=1; i<=n; i++) { int x; scanf("%d", &x); cnt[x]++; } memset(dp, 0, sizeof(dp)); for(int i=1; i<=100000; i++) { dp[i][0] = max(dp[i-1][0], dp[i-1][1]); dp[i][1] = dp[i-1][0] + (LL)(cnt[i])*(LL)(i); } LL ans = max(dp[100000][0], dp[100000][1]); printf("%I64d\n", ans); } return 0; }
相关文章推荐
- VectorDrawable与AnimatedVectorDrawable
- VectorDrawable与AnimatedVectorDrawable
- 每日一练——从长度为n的数组里选出m个数使和为固定值sum
- VectorDrawable与AnimatedVectorDrawable
- 【HDU 5698】瞬间移动(组合数,逆元)
- HMI
- reactJS - 02分离文件
- 【杭电2006】奇数的乘积
- Imgproc_2_杂项图像转换
- Jquery系列(三) DOM操作
- 文件内容差异对比
- IT职业图谱
- python核心编程十三章练习
- Java基础概念
- Android图片缓存的框架ImageLoader的使用
- Android数据库的事务
- JavaScrtip之JS最佳实践
- windows Socket编程之UDP的服务端和客户端
- linux基础命令
- APPUI