Codeforces Global Round 1 D - Jongmah(dp)

news/2024/11/25 0:28:24/

题目

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;
} 

 


http://www.ppmy.cn/news/877726.html

相关文章

HDLBits-Circuits学习小结(四)D触发器(latches and flip-flops)

目录 1 D触发器基础1.1 创建D触发器1.2 D触发器与复位功能 2 D触发器进阶2.1 创建有特定功能的D触发器2.2 D锁存器 3 D触发器与门电路的各种操作3.1 选择器和触发器3.2 门电路与触发器3.3 边沿检测&#xff08;重要&#xff09; 1 D触发器基础 1.1 创建D触发器 D触发器是一种…

使用CAPL 内置函数 memcpy 和memcmp 处理数组的若干问题

&#x1f345; 我是蚂蚁小兵&#xff0c;专注于车载诊断领域&#xff0c;尤其擅长于对CANoe工具的使用&#x1f345; 寻找组织 &#xff0c;答疑解惑&#xff0c;摸鱼聊天&#xff0c;博客源码&#xff0c;点击加入&#x1f449;【相亲相爱一家人】&#x1f345; 玩转CANoe&…

c语言定义浮点变量i和j,2012年计算机等级考试二级C语言基础教程:数据类型、变量和运算符...

2012年计算机等级考试二级C语言基础教程:数据类型、变量和运算符 分类:计算机等级 | 更新时间:2016-07-08| 来源:转载 本节首先介绍Turbo C程序的基本组成部分; 然后介绍Turbo C的数据类型、变量类型、变量的初始化和赋值; 最后介绍Turbo C的有关操作。通过本节的学习, 可以…

LWIP的RAW API UDP通信详解(stm32f103---enc28j60)

目录 LWIPLWIP简介LWIP主要特性 ENC28J60ENC28J60简介ENC28J60特点 无操作系统LWIP移植在说移植之前&#xff0c;先说下几个重要的函数功能和数据结构enc28j60.c文件主要结构体*netif*结构体定义&#xff08;netif.h&#xff09;只列出了比较重要的字段 lwip__comm.c文件__lwip…

lwip-2.1.3在STM32F103ZE+ENC28J60有线网卡上无操作系统移植(使用STM32 HAL库)

程序下载链接&#xff1a;百度网盘 请输入提取码&#xff08;提取码&#xff1a;k6tz&#xff09; 【重要说明】 连接方式一&#xff08;推荐&#xff09;&#xff1a; 电脑有线网卡断开&#xff0c;无线网卡连无线路由器&#xff0c;无线网卡配置成自动获取IP地址。 板子的E…

A/D和D/A

从我们学到的知识了解到&#xff0c;我们的单片机是一个典型的数字系统。数字系统只能对输入的数字信号进行处理&#xff0c;其输出信号也是数字信号。但是在工业检测系统和日常生活中的许多物理量都是模拟量&#xff0c;比如温度、长度、压力、速度等等&#xff0c;这些模拟量…

用计算机归零,windows自带的计算器清零快捷键是哪个?

满意答案 a1424440649 2013.01.15 采纳率:44% 等级:12 已帮助:7308人 清零键是esc,我用的Windows7,不知道计算器一样不,你试试... 其他的还有: 按键 功能 Atl+1 切换到标准模式 Alt+2 切换到科学型模式 Alt+3 切换到程序员模式 Alt+4 切换到统计信息模式 Ctrl+E 打开…

模数转换 A/D 与数模转换 D/A介绍

模数转换 A/D 与数模转换 D/A介绍 A/D 和 D/A 的基本概念 A/D 是模拟量到数字量的转换&#xff0c;依靠的是模数转换器(Analog to Digital Converter)&#xff0c;简称ADC。D/A 是数字量到模拟量的转换&#xff0c;依靠的是数模转换器(Digital to Analog Converter)&#xff0c…