【Leetcode Hard】1349. Maximum Students Taking Exam

2021/04/27 OJ每日一题 1506: 排座椅 python 1506: 排座椅: 上课的时候总有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情。不过,班主任小雪发现了一些有趣的现象,当同学们的座次确定下来之后,只有有限的D对同学上课时会交头接耳。同学们在教室中坐成了M行N列,坐在第i行第j列的同学的位置是(i, j),为了方便同学们进出,在教室中设置了K条横向的通道,L条纵向的通道。于是,聪明的小雪想到了一个办法,或许可以减少上课时学生交头接耳的问题:她打算重新摆放桌椅,改变同学们桌椅间通道的位置,因为如果一条通道隔开了两个会交头接耳的同学,那么 阅读详情

原题链接

题目描述

给你一个 m * n 的矩阵 seats 表示教室中的座位分布。如果座位是坏的(不可用),就用 ‘#’ 表示;否则,用 ‘.’ 表示。
学生可以看到左侧、右侧、左上、右上这四个方向上紧邻他的学生的答卷,但是看不到直接坐在他前面或者后面的学生的答卷。请你计算并返回该考场可以容纳的一起参加考试且无法作弊的最大学生人数。
学生必须坐在状况良好的座位上。

输入:seats = [["#",".","#","#",".","#"],
              [".","#","#","#","#","."],
              ["#",".","#","#",".","#"]]
输出:4
解释:教师可以让 4 个学生坐在可用的座位上,这样他们就无法在考试中作弊。

题目解法

真的惭愧,之前做contest做到这道hard题一点思路都没有,然后leetcode做题就停滞不前了,已经好长时间了,今天终于回来把这题啃下来了。
真的是非常非常感谢discussion里的那个vote数最多的大佬(https://leetcode.com/problems/maximum-students-taking-exam/discuss/503686/A-simple-tutorial-on-this-bitmasking-problem),讲解得非常清晰,跟着他的思路,参考下面有人实现的Java版本终于是AC了。
当然纯看别人的做法也不能说我就是懂了,只能现在这自己理理思路写一写,过两天再回来做一下试试看。

参考的解法用的是bitmask + dynamic programming,一个我没有接触过,一个我一直都不太懂×
简单理解如下:
bitmask:可以说是非常“程序员”的一种思想,要点就在于用二进制来翻译问题并用位操作来解决问题。通常用于题目中某个实体有“对立”的两种状态,比如这道题目中的seat分为“可用”和“不可用”,那么就可以用1表示可用,0表示不可用。
dynamic programming:将大问题分解为相似的子问题,用合理的方法解决每一个子问题,就相当于解决了大问题。比如这道题目中,要使得考场可以容纳最多的学生,那么每一排就要容纳尽可能多的学生。

解题思路简单归纳如下:

  1. 将每一排椅子的情况都用二进制表示出来(谁能想到我一开始看代码就卡在这里呢 ……主要是要有一个意识,就是尽管我们看到的是十进制数,但事实上在计算机内部存储的还是二进制形式,所以其实我们只要自己脑子里有这样一个一排代表的二进制序列,用一个int数把它存起来就行
  2. 暴力试探。我觉得这个方法总结下来就这四个字。(首先要建立一个意识就是现在每一排都是一个二进制序列,也就是一个十进制数)首先确定每一排所能表示的最大值,然后从0开始,暴力试探。试探到的数(二进制串)要满足两个基本要求:
    2.1 是该排座位情况的子集(就是坏的椅子位上不能坐人 / 不能为1)
    2.2 左右不能坐人
    满足这两个要求之后,如果这一排不是第一排,还有进一步的要求:
    2.3 左上不能坐人
    2.4 右上不能坐人
    记录每一个可能的二进制串所导致的学生总人数并选取最大值

code如下:

class Solution {
   
   
    public int maxStudents(char[][] seats) {
   
   
        int m = seats.length, n = seats[0].length;
        int[] valid = 
LeetCode 1349. Maximum Students Taking Exam(状压dp) 题目链接 题意: 让你给学生安排座位,有’#'号的不能坐,每个学生能看到左右和左上右上四个方向的人的试卷,请你给学生们安排座位使得学生人数最多 思路 经典的状态压缩dp问题,观察到n和m最大只有8,很明显可以利用二进制来确定第一行的状态,只要第一行定了剩下几行也就定的,最后维护最一行的最大值即可。 dp[i][j]dp[i][j]dp[i][j]表示第iii为第jjj个状态时的最大值,状态转移方程... 阅读详情

相关推荐

Unity安卓打包实战:SDK与JDK配置全攻略

本文详细介绍了Unity安卓打包过程中SDK与JDK的配置方法,包括工具下载、安装步骤、环境变量设置及常见错误排查。通过实战指南帮助开发者快速完成Unity安卓打包环境搭建,提升开发效率。

weixin_30338481的博客 416

无线自组织网络基础知识

参考书籍:《无线自组织网络路由协议及应用》 目录第一章 绪论1.1 无线自组织网络概述1.1.1 无线自组织网络的定义及分类1.1.2无线自组织网络的主要特点1.1.3无线自组织网络的应用与发展1.无线自组织网络的应用2.无线自组织网络的起源和发展1.2典型的无线自组织网络1.2.1移动Ad Hoc网络1、移动Ad Hoc网络的定义2.移动AdHoc网络的特点3.移动Ad Hoc网络的应用1.2....

逸凌Time 2万+

从Transformer到Mamba:显著性检测领域的计算效率革命(Samba框架深度解析)

本文深入解析了Samba框架在显著性目标检测(Salient Object Detection)领域的创新应用,通过结合Mamba架构的优势,实现了计算效率的革命性提升。Samba框架采用显著性引导的Mamba模块(SGMB)和上下文感知上采样(CAU),有效解决了传统CNN和Transformer的局限性,同时在RGB-D等多模态任务中展现出卓越性能。

mmm90的博客 557

相控阵多功能雷达工作模式识别技术综述

本文综述了相控阵雷达工作模式识别技术的研究进展。首先介绍了相控阵雷达的典型工作模式分类及其信号特征参数,包括搜索模式(VS、RWS、TWS)、跟踪模式(STT、MTT、TAS)和其他模式(SAM、SAR)等。随后重点阐述了基于信号特征的识别方法,包括时域特征(PRI分析、脉冲幅度包络、数据率)、频域特征(载频变化、调制方式)和混合特征分析方法。最后讨论了当前技术面临的挑战与发展趋势,包括复杂信号环境下的识别难题、新型雷达技术的适应需求以及深度学习技术的应用前景。该领域的研究对电子侦察和威胁评估具有重要意义。

Grow into a more wonderful you 1810

告别重打包:在Android 9上实现免Root的Frida-Gadget持久化Hook(附AOSP源码修改详解)

本文详细介绍了在Android 9上实现免Root的Frida-Gadget持久化Hook技术方案。通过修改AOSP源码,绕过传统重打包方式面临的签名校验和完整性检查,实现在非Root环境下的系统级Hook。文章包含核心代码修改、编译配置调整及调试技巧,为移动安全研究提供高效稳定的解决方案。

weixin_33726313的博客 501

STEP 7-Micro/WIN SMART 编程软件:从入门到精通的使用指南

通过不断实践,熟悉软件的各项功能和操作技巧,工程师可更好地应对工业自动化控制中的各种挑战,开发出高效、稳定的控制程序。项目的基本组件是构成程序的核心元素,包括:程序块(主程序 OB1、子程序和中断程序)、数据块(给 V 存储器赋初值)、系统块(硬件组态和参数设置)、符号表(用符号代替存储器地址,使程序更易理解)以及状态图表(监视、修改和强制变量状态)。下载程序时,单击工具栏上的 “下载” 按钮,在弹出的下载对话框中选择要下载的块(程序块、数据块、系统块),单击 “下载” 即可。

电工 5573

多角度模板匹配的模板创建技巧

基于形状的模板匹配多角度创建技巧

manuoo的专栏 3403

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

上一篇: 【Leetcode Medium】1348. Tweet Counts Per Frequency
下一篇: 【Vue 踩坑】本地静态图片加载失败问题
JellyFishDing
博客等级 码龄8年 4粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值