题目

n张牌,m种牌,每个牌上一个号

可以连续打三个(3 3 3),也可以连续打顺子(1 2 3)

问最多能打多少组

思路来源

马老师&&航神

题解

首先如果连续3个都有三个,打三个顺和三个仨是一样的,成组消去

打3个相同的也是足够优的,但不是绝对的,

可以证明(好吧我证明不了),

每个拿出6个来专门用于凑顺,

最多给上上个提供2个,上个提供2个,自己开头提供2个

这样足够了,剩下多的用于打仨就行了

dp[i+1][j][k]代表对于值为i的数来说,专门拿出j个去凑以i-1开头的顺子,专门拿出k个去凑以i开头的顺子

dp[i+1][k][l]=max(dp[i][j][k]+(num[i]-j-k-l)/3+l,dp[i+1][k][l]);
dp[下一个值][当前值挪出来凑以上一个值开头的顺子的个数][当前值挪出来凑当前值开头的顺子的个数]
j k l就分别是挪出来凑上上个值 上个值 和当前值的个数
为了避免重复统计,只把这些顺子统计在那个开头的值里面,所以加上l
而最后dp[m+1][0][0]显然对于i=m而言,i-1和i都凑不出顺子了(因为没有i+1),所以均0是最优的

心得

感觉是三步三步滑动的这样一个状态转移dp

其实自己写wa贪心代码的时候也考虑着

如果出现1 3 2,1 2 3,1 2 1,2 2 3,这些连续的三个的情况该怎么搞……

然后还分类讨论贪心来着,

现在看来,暴力让它们一起往后推,是为dp。

代码

滚动数组要清零,不然受i-2那个结果影响。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn=1e6+10;
int dp[2][3][3];
int num[maxn],n,m;
int main()
{ scanf("%d%d",&n,&m);for(int i=0;i<n;++i){int x;scanf("%d",&x);num[x]++;   }for(int i=1;i<=m;++i){ for(int k=0;k<3;++k){for(int l=0;l<3;++l){dp[(i+1)%2][k][l]=0;}}for(int j=0;j<3;++j){for(int k=0;k<3;++k){for(int l=0;l<3;++l){if(num[i]<j+k+l)continue;dp[(i+1)%2][k][l]=max(dp[i%2][j][k]+(num[i]-j-k-l)/3+l,dp[(i+1)%2][k][l]);}}} }printf("%d\n",dp[(m+1)%2][0][0]); return 0;
} 

Codeforces Global Round 1 D - Jongmah(dp)相关推荐

  1. Codeforces Global Round 14 F. Phoenix and Earthquake 思维 + 并查集

    传送门 文章目录 题意: 思路: 题意: 给你nnn个点,mmm条边,限制xxx,每个点都有沥青aia_iai​,定义合并两个点即两点之间有边且au+av≥xa_u+a_v\ge xau​+av​≥x ...

  2. codeforces global round 23

    constest :codeforces global round 23 contest time:2022.10.16 contest grade: 2800 contest rating chan ...

  3. Codeforces Global Round 1 晕阙记

    Codeforces Global Round 1 晕阙记 我做这场比赛的时候晕得要死.做这三道题做太久了,rating涨不起来啊! A 如果愿意的话你可以看做是膜2意义下的运算,写快速幂等各种膜运算 ...

  4. Codeforces Global Round 3

    Codeforces Global Round 3 A. Another One Bites The Dust 有若干个a,有若干个b,有若干个ab.你现在要把这些串拼成一个串,使得任意两个相邻的位置 ...

  5. Codeforces Global Round 1

    Codeforces Global Round 1 题解:The Editorial of the First Codeforces Global Round A:其实mod 2计算一下就行了 B:删 ...

  6. 【Codeforces Global Round 23】B. Rebellion

    Codeforces Global Round 23中B. Rebellion Codeforces比赛记录 文章目录 题目链接: 一.B. Rebellion 题目意思: 上思路: 总结 B. Re ...

  7. Codeforces Global Round 4-D. Prime Graph(伯特兰-切比雪夫定理)

    题目:Codeforces Global Round 4-D. Prime Graph 题意:给出n(顶点的个数),要求所得图满足: 1.无平行边和自环 2.边的总数是个质数 3.每个点的度(也就是点 ...

  8. Codeforces Global Round 14 E. Phoenix and Computers 思维 + dp

    传送门 文章目录 题意: 思路: 题意: 有nnn台电脑,你可以手动打开某个电脑,如果第i−1,i+1i-1,i+1i−1,i+1台电脑都打开了,那么第iii台电脑会自动打开.不能手动打开自动打开的电 ...

  9. Codeforces Beta Round #17 C. Balance DP

    C. Balance 题目链接 http://codeforces.com/contest/17/problem/C 题面 Nick likes strings very much, he likes ...

最新文章

  1. 失败原因_解析干洗店失败原因
  2. 他失明40年,只因戴上了这副护目镜,现在竟能数清斑马线 | Nature子刊
  3. centos6 安装 mantisbt-1.2.8 —— (1) VMware Workstation 12 Pro 虚拟机安装步骤详解(window 10 系统)
  4. element文件上传有文件但是后台接收为空_程序员提高篇:大规格文件(G)是如何做分片优化的?...
  5. KP-ABE基于属性的加密加解密算法及Access Tree构建
  6. vfp体积计算机程序,计算机vfp教程第9章 报表与菜单设计
  7. [KALI] 开启ssh远程连接
  8. 中央电视台的糖尿病案例解说 作者:倪海厦
  9. unity 导入 obj 模型 和 json 数据
  10. coreldraw x7如何禁网_出现问题如何修改和修复安装coreldraw x7
  11. PDF如何解密?这些方法你知道吗?
  12. 怎么查看笔记本内存条型号_笔记本内存条型号简介以及查看方法【图文教程】...
  13. 多级评论回复功能(纯前端,未连数据库)
  14. CentOS 7.6 编译安装最新版本glibc2.30 实录
  15. Linux的firewalld防火墙学习笔记220929
  16. 最新基于ThinkPHP5.0+BootStrap框架开发的自适应WAP手机端响应式界面博客系统PHP源码
  17. PyQt4 做界面,编辑文字 QtGui.QLabel遇到文字显示不出来
  18. 要求统计10个整数中的奇偶数的个数C语言,C语言:输入10个整数,求出它们的和,统计其中偶数的个数,输出其中的奇数....
  19. 创业者的技能树 -上篇
  20. Linux下进程间通信方式

热门文章

  1. Python3 操作MongoDB数据库
  2. freemaker导出pdf供下载
  3. 太气愤了!太气愤了!太气愤了!
  4. 【重榜】易语言锁机病毒模块分享!!!!
  5. java黄油刀_使用ButterKnife (黄油刀报错)
  6. Swift 基本知识点之七类与结构体
  7. android:theme 华为,Launcher for Huawei, Theme Huawei Free
  8. 压电陶瓷换能器 超声波发射模块驱动原理图及时序
  9. Android数据存储、文件存储、SQLite数据库简单使用、 sharedPreferences存储(五)
  10. IntelliJ IDEA必备插件