Codeforces 1110D Jongmah 题解 [ 蓝 ] [ 线性 dp ] [ 观察 ]
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_{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 ] [ 观察 ]的更多相关文章
- Codeforces 1110D Jongmah [DP]
洛谷 Codeforces 我-我我把这-这这题切了??? 说实话这题的确不难,只是我看到有大佬没做出来有点慌-- 突然发现这题是我在洛谷的第500个AC呢.那就更要写篇题解纪念一下了. 思路 容易想 ...
- Codeforces 1110D Jongmah (DP)
题意:你有n个数字,范围[1, m],你可以选择其中的三个数字构成一个三元组,但是这三个数字必须是连续的或者相同的,每个数字只能用一次,问这n个数字最多构成多少个三元组? 解析:首先我们容易发现,我们 ...
- Codeforces 1110D. Jongmah 动态规划
原文链接https://www.cnblogs.com/zhouzhendong/p/CF1110D.html 题意 给定 n 个数,每一个数都是在 [1,m] 里的整数. 从中取出形如 {x,x,x ...
- Codeforces 446A. DZY Loves Sequences (线性DP)
<题目链接> 题目大意: 给定一个长度为$n$的序列,现在最多能够改变其中的一个数字,使其变成任意值.问你这个序列的最长严格上升子段的长度是多少. #include <bits/st ...
- 【AHOI2009】中国象棋 题解(线性DP+数学)
前言:这题主要是要会设状态,状态找对了问题迎刃而解. --------------------------- 题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可 ...
- Codeforces 176B (线性DP+字符串)
题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=28214 题目大意:源串有如下变形:每次将串切为两半,位置颠倒形成 ...
- [线性DP][codeforces-1110D.Jongmah]一道花里胡哨的DP题
题目来源: Codeforces - 1110D 题意:你有n张牌(1,2,3,...,m)你要尽可能多的打出[x,x+1,x+2] 或者[x,x,x]的牌型,问最多能打出多少种牌 思路: 1.三组[ ...
- [CodeForces - 1272D] Remove One Element 【线性dp】
[CodeForces - 1272D] Remove One Element [线性dp] 标签:题解 codeforces题解 dp 线性dp 题目描述 Time limit 2000 ms Me ...
- 洛谷P1140 相似基因(线性DP)
题目背景 大家都知道,基因可以看作一个碱基对序列.它包含了444种核苷酸,简记作A,C,G,TA,C,G,TA,C,G,T.生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物. 在一个人类 ...
- POJ 2479-Maximum sum(线性dp)
Maximum sum Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 33918 Accepted: 10504 Des ...
随机推荐
- RabbitMQ接入之PHP
上一篇记录下RabbitMQ的安装与管理界面,接下来开始看PHP是如何接入的 1.安装php-amqplib php-amqplib是一个纯PHP库,使用它,基于PHP的脚本客户端就可以轻松的连接和操 ...
- nodejs版本管理工具之nvm
有时候 项目中依赖不同版本的node,这就需要我们使用一个版本管理工具 有序的管理这些node,这里介绍使用nvm GitHub地址:https://github.com/nvm-sh/nvm 前提: ...
- 表里不一--限制容器内存4G,free还是32G
前言 最近有个新同事问了我一个问题,明明通过limit给容器内存限制了4G,为什么进容器看到的还是宿主机的内存32G docker run -it --rm -m 512m ubuntu:18.04 ...
- Ant Design Pro项目启动报can not resolve dependence:’…/node_modules/@umijs/renderer-react‘
前情 公司有经常需要做一些后台管理页面,我们选择了Ant Design Pro,它是基于 Ant Design 和 umi 封装的一整套企业级中后台前端/设计解决方案. 坑位 今天启动项目报如下图 W ...
- arbitrum 资产桥合约
资产桥的作用 Rollup 的主要流程中,实际上不包含资产桥,也就是说即使没有资产桥,L2依然能正常运行但是此时L1与L2在数据上是完全独立的两条链,L1不理解L2上的数据(L1只保存L2压缩后的数据 ...
- Flutter TextField设置值后光标位置偏移
Flutter TextField设置值后光标位置偏移 一般用controller设置值是这样设置的 TextEditingController controller = TextEditingCon ...
- Python 证件照换底色
# -*- coding: utf-8 -*- ''' @Time : 2021/4/12 19:06 @Author : 水一RAR ''' import numpy as np import cv ...
- Dapr-3: 从 20000 英尺之上俯瞰 Dapr
第 3 章 从 20000 英尺之上俯瞰 Dapr Dapr at 20,000 feet | Microsoft Docs 在第 1 章中,我们讨论了分布式微服务应用的吸引力.但是,我们也指出了它会 ...
- Spring Cloud Sleuth in a Monolith Application
1. Overview In this article, we're introducing Spring Cloud Sleuth – a powerful tool for enhancing ...
- DDD你真的理解清楚了吗?怎么准确理解“值对象”
这些年,随着软件业的不断发展,软件系统开始变得越来越复杂而难于维护.这时,越来越多的开发团队开始选择实践DDD领域驱动设计.领域驱动设计是一种非常优秀的软件设计思想,它可以非常好地帮助我们梳理复杂业务 ...