Codeforces 1110D Jongmah (DP)
题意:你有n个数字,范围[1, m],你可以选择其中的三个数字构成一个三元组,但是这三个数字必须是连续的或者相同的,每个数字只能用一次,问这n个数字最多构成多少个三元组?
解析:首先我们容易发现,我们发现,假设有3个三元组(x, x + 1, x + 2),我们不妨把这3个三元组换成(x, x, x), (x + 1, x + 1, x + 1), (x + 2, x + 2, x + 2)这3个三元组。那么,对于每个x,最多有2个(x, x + 1, x + 2)这样的三元组。这样,每个阶段的状态数就是有限的了。
设dp[i][j][k]为数字1到i,有j个(i - 1, i , i + 1)三元组,k个(i , i + 1, i + 2)三元组可以组成的最多的三元组的数目,我们现在考虑向i + 1转移。因为前面有j个(i - 1, i , i + 1),k个(i , i + 1, i + 2),假设本来有t个i + 1,那么现在可用来构成新的三元组的i + 1有t - j - k个。
这t - j - k个i + 1可以用来构成(i + 1, i + 2, i + 3),也可用来构成(i + 1, i + 1, i + 1)。我们就可以枚举这些i + 1是形成什么样的三元组来进行状态转移了。初态:dp[0][0][0] = 0,其余负无穷。末态:dp[m + 1][0][0]。因为m + 1肯定没有数,所以dp[m + 1][0][0]是m + 1处的唯一合法状态,也就是答案。
代码:
#include <bits/stdc++.h>
#define ls(x) (x << 1)
#define rs(x) ((x << 1) | 1)
#define lowbit(x) (x & (-x))
#define LL long long
#define INF 0x3f3f3f3f
using namespace std;
const int maxn = 1000010;
int a[maxn], cnt[maxn];
int dp[maxn][3][3];
int main () {
int n, m;
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
cnt[a[i]]++;
}
memset(dp, -0x3f, sizeof(dp));
dp[0][0][0] = 0;
for (int i = 0; i <= m + 1; i++) {
for (int j = 0; j < 3; j++)
for (int k = 0; k < 3; k++) {
if(dp[i][j][k] < 0) continue;
int now = cnt[i + 1] - j - k;
for (int t = 0; t < 3 && t <= now; t++) {
dp[i + 1][k][t] = max(dp[i + 1][k][t], dp[i][j][k] + (now - t) / 3 + t);
}
}
}
printf("%d\n", dp[m + 1][0][0]);
return 0;
}
Codeforces 1110D Jongmah (DP)的更多相关文章
- codeforces Educational Codeforces Round 16-E(DP)
题目链接:http://codeforces.com/contest/710/problem/E 题意:开始文本为空,可以选择话费时间x输入或删除一个字符,也可以选择复制并粘贴一串字符(即长度变为两倍 ...
- CF1110D Jongmah(DP)
题目链接:CF原网 洛谷 题目大意:有 $n$ 个数,每个都不超过 $m$.一个三元组 $(a,b,c)$ 是合法的当且仅当 $a=b=c$ 或者 $a+1=b=c-1$.每个数只能用一次.问最多能 ...
- Codeforces 837D--Round Subset (DP)
原题链接:http://codeforces.com/contest/837/problem/D 题意:在n个数字中,取k个数,使这些数的乘积后缀“0”的个数最大,输出后缀0的最大数量. 思路:显然只 ...
- CodeForces 455A Boredom (DP)
Boredom 题目链接: http://acm.hust.edu.cn/vjudge/contest/121334#problem/G Description Alex doesn't like b ...
- Codeforces 864E Fire(DP)
题目链接 Fire 题意 有n个物品,每个物品的挽救时间代价为ti, 消失时刻为di, 价值为pi. 如果要救某个物品,必须在他消失之前救出来. 同一时刻最多只能救一件物品. 当前耗时为当前已经救出的 ...
- LightOJ 1033 Generating Palindromes(dp)
LightOJ 1033 Generating Palindromes(dp) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid= ...
- lightOJ 1047 Neighbor House (DP)
lightOJ 1047 Neighbor House (DP) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87730# ...
- UVA11125 - Arrange Some Marbles(dp)
UVA11125 - Arrange Some Marbles(dp) option=com_onlinejudge&Itemid=8&category=24&page=sho ...
- 【POJ 3071】 Football(DP)
[POJ 3071] Football(DP) Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4350 Accepted ...
随机推荐
- jenkins显示发送邮件成功,但未收到邮件
一. 构建的控制台输出显示日志发送成功,但是未收到邮件 今天在完成构建的时候,破天荒的发现构建的控制台输出显示日志发送成功,但QQ邮箱的确没收到邮件 15:22:40 D:\python_worksh ...
- 将一个jar包放到linux下定时执行
将一个jar包放到linux下定时执行 1.在dbtodb文件夹下新建一个dbtodb.sh,脚本内容为: #!/bin/bash cd /usr/dbtodb/ java -jar dbtodb.j ...
- PromiseJs
(function() { var define, requireModule, require, requirejs; (function() { var registry = {}, seen = ...
- Nodejs调试技术总结
调试技术与开发技术构成了软件开发的基石.目前Nodejs作为新型的Web Server开发栈倍受开发者关注.总的来说Nodejs的应用程序主要有两部分:JavaScript编写的js模块和C语言编译的 ...
- (转)Java发送http请求(get 与post方法请求)
本文转载于:http://bijian1013.iteye.com/blog/2166855 package com.bijian.study; import java.io.BufferedRead ...
- poj1325
给出一系列任务,每个任务可以在机器A的某个模式,或者在机器B的某个模式下完成.机器A和B每切换一次模式需要重启一次.问完成这些任务,最少需要重启机器多少次? 把任务看作边 “重启”操作看作点 这道题就 ...
- 大鱼吃小鱼(运用stack的模拟)
个人心得:这一题在暑假集训的周测里做到过,当时就死模拟,然后卡了很久很久才做对.现在发现运用stack其实非常方便, 将向左向右游动的鱼分开,则往后走只要往右移动的就放入stack,往左的时候就与st ...
- C#获取堆栈信息,输出文件名、行号、函数名、列号等
命名空间:System.Diagnostics 得到相关信息: StackTrace st = new StackTrace(new StackFrame(true));StackFrame sf = ...
- Python函数 __import__()
功能: __import__() 函数用于动态加载类和函数 .返回元组列表. 如果一个模块经常变化就可以使用 __import__() 来动态载入. __import__ 语法: __import__ ...
- Java编程思想第七章复用类
7.1组合语法 在一个类中引入多个对象,以提高代码的复用性与功能. 7.2继承语法 使用继承子类可以获得,导出类可以获得基类的成员(变量与方法). 注:这里注意权限控制,若基类中的成员为默认权限,只有 ...