CF1110D Jongmah
题目地址:CF1110D Jongmah
约定:称形如 \([a-1,a,a+1]\) 这样的三元组为关于 \(a\) 的顺子,形如 \([a,a,a]\) 这样的三元组为关于 \(a\) 的对子。
注意到如果一个关于 \(a\) 的顺子出现三次,则可以将其拆分为三个分别关于 \(a-1,a,a+1\) 的对子。
考虑DP:
设 \(c_i\) 为 \(i\) 的个数。
设 \(f_{i,j,k}\) 为考虑到数 \(i\),关于 \(i\) 的顺子有 \(j\) 个,关于 \(i+1\) 的顺子有 \(k\) 个的最多三元组个数,根据上面的分析,\(j,k\in \{0,1,2\}\)。
状态转移方程:\(f_{i,k,t}=max_{j\in \{0,1,2\},c_i-j-k-t\geq 0}\ (f_{i-1,j,k}+(c_i-j-k-t)/3+t)\)
优化和技巧:
DP到第 \(m+2\) 个,目标:\(ans=f_{m+2,0,0}\)
滚动数组优化空间,\(f\) 数组就可以只开233 (雾,因此目标: \(ans=f_{(m+2)\&1,0,0}=f_{m\&1,0,0}\)
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 6;
int n, m, c[N], f[2][3][3];
int main() {
cin >> n >> m;
while (n--) {
int x;
scanf("%d", &x);
++c[x];
}
for (int i = 1; i <= m + 2; i++) {
int p = i & 1, q = p ^ 1;
memset(f[p], 0, sizeof(f[p]));
for (int j = 0; j < 3; j++)
for (int k = 0; k < 3; k++)
for (int t = 0; t < 3; t++)
if (c[i] - j - k - t >= 0)
f[p][k][t] = max(f[p][k][t], f[q][j][k] + (c[i] - j - k - t) / 3 + t);
}
cout << f[m&1][0][0] << endl;
return 0;
}
CF1110D Jongmah的更多相关文章
- CF1110D Jongmah(DP)
题目链接:CF原网 洛谷 题目大意:有 $n$ 个数,每个都不超过 $m$.一个三元组 $(a,b,c)$ 是合法的当且仅当 $a=b=c$ 或者 $a+1=b=c-1$.每个数只能用一次.问最多能 ...
- Codeforces 1110D. Jongmah 动态规划
原文链接https://www.cnblogs.com/zhouzhendong/p/CF1110D.html 题意 给定 n 个数,每一个数都是在 [1,m] 里的整数. 从中取出形如 {x,x,x ...
- Codeforces Global Round 1 - D. Jongmah(动态规划)
Problem Codeforces Global Round 1 - D. Jongmah Time Limit: 3000 mSec Problem Description Input Out ...
- CF 1110 D. Jongmah
D. Jongmah 链接 题意: 一些数字,有两种方式组成一个三元组,[x,x,x],[x,x+1,x+2],每个数字只能用一次,求最多组成多少三元组. 分析: 因为每三个[x,x+1,x+2]是可 ...
- Codeforces 1110D Jongmah [DP]
洛谷 Codeforces 我-我我把这-这这题切了??? 说实话这题的确不难,只是我看到有大佬没做出来有点慌-- 突然发现这题是我在洛谷的第500个AC呢.那就更要写篇题解纪念一下了. 思路 容易想 ...
- cf1110d 线性dp
很精练的一道题 /* dp[i][j][k]表示值i作为最大值结束的边剩k条,i-1剩下j条的情况的结果 dp[i][k][l]是由dp[i-1][j][k]的j决定的,因为k+l是被留下给后面用的, ...
- 【Codeforces 1110D】Jongmah
Codeforces 1110 D 题意:给\(n\)个麻将,每个麻将上有一个\(1..m\)的整数\(a_i\). 现在要将这些麻将们分成一个一个三元组,有两种情况: \([i-1,i,i+1]\) ...
- 【Codeforces 1110D】Jongmah FST分析
Codeforces 1110 D FST分析 dotorya.FizzyDavid.MofK.gamegame.matthew99.chokudai.eddy1021.DBradac.Happy_N ...
- 「日常训练」Jongmah(Codeforces-1110D)
题意 你有n个数字,范围[1, m],你可以选择其中的三个数字构成一个三元组,但是这三个数字必须是连续的或者相同的,每个数字只能用一次,问这n个数字最多构成多少个三元组? 分析 根据官方Editori ...
随机推荐
- linux driver ------ 字符设备驱动 之 “ 创建设备节点流程 ”
在字符设备驱动开发的入门教程中,最常见的就是用device_create()函数来创建设备节点了,但是在之后阅读内核源码的过程中却很少见device_create()的踪影了,取而代之的是device ...
- Java流程语句
流程控制语句 if语句: if语句的执行流程 例子: public class IfDemo01 { public static void main(String[] args) { int x = ...
- 面向对象【day08】:异常处理-断言(七)
本节内容 1.概述 2.知识点回顾 3.断言 一.概述 python中断言,这个我是第一次听说到的,断言有什么用呢?断言就是做一些程序的检查工作,就是在执行之前需要做的一些检查,比如类似于安检一样,合 ...
- C#与 微信小程序 互为加解密方案
CryptoJS下载地址: https://code.google.com/archive/p/crypto-js/downloads http://download.csdn.net/detail/ ...
- 解析ArcGis的字段计算器(三)——文本型字段计算,编号那些事儿
实际操作中我们一般会将编号字段定义为文本型,因为编号不是序号,序号是一个递增数值,而编号往往是一个数字串代码. 本篇无说明的均使用VBScript语句1.怎么编号?最简单的编号—>直接在编号字段 ...
- python实现双向链表
双向链表 一种更复杂的链表是“双向链表”或“双面链表”.每个节点有两个链接:一个指向前一个节点,当此节点为第一个节点时,指向空值:而另一个指向下一个节点,当此节点为最后一个节点时,指向空值. 实现 c ...
- int、bool和str
int bit_length 返回以二进制表示的最短长度 print(int.bit_length(10)) 结果 4 Process finished with exit code 0 int() ...
- maven项目配置框架
任何一个maven项目都会继承一个默认的父pom配置:Super POM,详见:https://maven.apache.org/guides/introduction/introduction-to ...
- Vertica系列: 自动生成Identity 字段值的方法
参考 https://thisdataguy.com/2015/01/05/vertica-some-uses-of-sequences/ 在 vertica 中有三种定义 identity 字段的方 ...
- 使用PHP+MySql+Ajax+jQuery实现省市区三级联动功能
使用PHP+MySql+Ajax+jQuery实现省市区三级联动功能 要求:写一个省市区(或者年月日)的三级联动,实现地区或时间的下拉选择. 实现技术:php ajax 实现:省级下拉变化时市下拉区下 ...