Jongmah:小清新麻将 dp 题。

观察

首先观察这两个操作的性质,不难发现我们出掉的所有的顺子只要累计出了三次,这三次顺子就一定可以化作出三次相同的单牌。

而我们只需要最大化操作次数,显然这三次顺子和三次单牌是等价的,所以我们把三次顺子转化为我们更容易处理的三次相同单牌。

同时,我们得出结论:任何一个顺子最多只能出 \(2\) 次,否则一定可以被三个相同的牌代替掉一部分顺子。

实现

这个性质就很好 dp 了,首先把所有牌扔进桶里是显然的。因为 \(i-2,i-1\) 为开头的顺子会影响 \(i\) 为开头的顺子的计算,所以我们将它们放入状态定义中。

设计 \(dp_{i,j,k}\) 表示当前出到第 \(i\) 位(位就是牌的种类),第 \(i-1\) 位为开头的顺子出了 \(j\) 个,第 \(i\) 位为开头的顺子出了 \(k\) 个。其中 \(0 \le j,k \le 2\)。第 \(i-2\) 位在给后面状态转移时不会用到,只有给当前位转移才会用到。所以在转移的时候枚举第 \(i-2\) 位出的顺子数 \(l\) 即可。

因此有如下转移:

\[dp_{i,j,k}=\max_{l=0}^{2}dp_{i-1,l,j}+\left\lfloor\frac{tot_i-j-k-l}{3}\right\rfloor+k
\]

答案即为 \(dp_{m,0,0}\),因为 \(m-1\) 位以后不足三种牌,不能组成顺子。

时间复杂度 \(O(m\times 3^3)\)。

代码

#include <bits/stdc++.h>
#define fi first
#define se second
#define lc (p<<1)
#define rc ((p<<1)|1)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
using pi=pair<int,int>;
int n,m,dp[1000005][3][3],tot[1000005],ans;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
tot[x]++;
}
memset(dp,-0x3f,sizeof(dp));
dp[0][0][0]=0;
for(int i=1;i<=m;i++)
{
for(int a=0;a<3;a++)
{
for(int b=0;b<3;b++)
{
for(int c=0;c<3;c++)
{
if(tot[i]-a-b-c>=0)dp[i][b][c]=max(dp[i][b][c],dp[i-1][a][b]+(tot[i]-a-b-c)/3+c);
}
}
}
}
cout<<dp[m][0][0];
return 0;
}

Codeforces 1110D Jongmah 题解 [ 蓝 ] [ 线性 dp ] [ 观察 ]的更多相关文章

  1. Codeforces 1110D Jongmah [DP]

    洛谷 Codeforces 我-我我把这-这这题切了??? 说实话这题的确不难,只是我看到有大佬没做出来有点慌-- 突然发现这题是我在洛谷的第500个AC呢.那就更要写篇题解纪念一下了. 思路 容易想 ...

  2. Codeforces 1110D Jongmah (DP)

    题意:你有n个数字,范围[1, m],你可以选择其中的三个数字构成一个三元组,但是这三个数字必须是连续的或者相同的,每个数字只能用一次,问这n个数字最多构成多少个三元组? 解析:首先我们容易发现,我们 ...

  3. Codeforces 1110D. Jongmah 动态规划

    原文链接https://www.cnblogs.com/zhouzhendong/p/CF1110D.html 题意 给定 n 个数,每一个数都是在 [1,m] 里的整数. 从中取出形如 {x,x,x ...

  4. Codeforces 446A. DZY Loves Sequences (线性DP)

    <题目链接> 题目大意: 给定一个长度为$n$的序列,现在最多能够改变其中的一个数字,使其变成任意值.问你这个序列的最长严格上升子段的长度是多少. #include <bits/st ...

  5. 【AHOI2009】中国象棋 题解(线性DP+数学)

    前言:这题主要是要会设状态,状态找对了问题迎刃而解. --------------------------- 题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可 ...

  6. Codeforces 176B (线性DP+字符串)

    题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=28214 题目大意:源串有如下变形:每次将串切为两半,位置颠倒形成 ...

  7. [线性DP][codeforces-1110D.Jongmah]一道花里胡哨的DP题

    题目来源: Codeforces - 1110D 题意:你有n张牌(1,2,3,...,m)你要尽可能多的打出[x,x+1,x+2] 或者[x,x,x]的牌型,问最多能打出多少种牌 思路: 1.三组[ ...

  8. [CodeForces - 1272D] Remove One Element 【线性dp】

    [CodeForces - 1272D] Remove One Element [线性dp] 标签:题解 codeforces题解 dp 线性dp 题目描述 Time limit 2000 ms Me ...

  9. 洛谷P1140 相似基因(线性DP)

    题目背景 大家都知道,基因可以看作一个碱基对序列.它包含了444种核苷酸,简记作A,C,G,TA,C,G,TA,C,G,T.生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物. 在一个人类 ...

  10. POJ 2479-Maximum sum(线性dp)

    Maximum sum Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 33918   Accepted: 10504 Des ...

随机推荐

  1. RabbitMQ接入之PHP

    上一篇记录下RabbitMQ的安装与管理界面,接下来开始看PHP是如何接入的 1.安装php-amqplib php-amqplib是一个纯PHP库,使用它,基于PHP的脚本客户端就可以轻松的连接和操 ...

  2. nodejs版本管理工具之nvm

    有时候 项目中依赖不同版本的node,这就需要我们使用一个版本管理工具 有序的管理这些node,这里介绍使用nvm GitHub地址:https://github.com/nvm-sh/nvm 前提: ...

  3. 表里不一--限制容器内存4G,free还是32G

    前言 最近有个新同事问了我一个问题,明明通过limit给容器内存限制了4G,为什么进容器看到的还是宿主机的内存32G docker run -it --rm -m 512m ubuntu:18.04 ...

  4. Ant Design Pro项目启动报can not resolve dependence:’…/node_modules/@umijs/renderer-react‘

    前情 公司有经常需要做一些后台管理页面,我们选择了Ant Design Pro,它是基于 Ant Design 和 umi 封装的一整套企业级中后台前端/设计解决方案. 坑位 今天启动项目报如下图 W ...

  5. arbitrum 资产桥合约

    资产桥的作用 Rollup 的主要流程中,实际上不包含资产桥,也就是说即使没有资产桥,L2依然能正常运行但是此时L1与L2在数据上是完全独立的两条链,L1不理解L2上的数据(L1只保存L2压缩后的数据 ...

  6. Flutter TextField设置值后光标位置偏移

    Flutter TextField设置值后光标位置偏移 一般用controller设置值是这样设置的 TextEditingController controller = TextEditingCon ...

  7. Python 证件照换底色

    # -*- coding: utf-8 -*- ''' @Time : 2021/4/12 19:06 @Author : 水一RAR ''' import numpy as np import cv ...

  8. Dapr-3: 从 20000 英尺之上俯瞰 Dapr

    第 3 章 从 20000 英尺之上俯瞰 Dapr Dapr at 20,000 feet | Microsoft Docs 在第 1 章中,我们讨论了分布式微服务应用的吸引力.但是,我们也指出了它会 ...

  9. Spring Cloud Sleuth in a Monolith Application

    1. Overview   In this article, we're introducing Spring Cloud Sleuth – a powerful tool for enhancing ...

  10. DDD你真的理解清楚了吗?怎么准确理解“值对象”

    这些年,随着软件业的不断发展,软件系统开始变得越来越复杂而难于维护.这时,越来越多的开发团队开始选择实践DDD领域驱动设计.领域驱动设计是一种非常优秀的软件设计思想,它可以非常好地帮助我们梳理复杂业务 ...