LeetCode 每日一题 Day 24(Hard) ||dp动态规划

1349. 参加考试的最大学生数

给你一个 m * n 的矩阵 seats 表示教室中的座位分布。如果座位是坏的(不可用),就用 ‘#’ 表示;否则,用 ‘.’ 表示。

学生可以看到左侧、右侧、左上、右上这四个方向上紧邻他的学生的答卷,但是看不到直接坐在他前面或者后面的学生的答卷。请你计算并返回该考场可以容纳的同时参加考试且无法作弊的 最大 学生人数。

学生必须坐在状况良好的座位上。

示例 1:

在这里插入图片描述

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

输入:seats = [[“.”,“#”],
[“#”,“#”],
[“#”,“.”],
[“#”,“#”],
[“.”,“#”]]
输出:3
解释:让所有学生坐在可用的座位上。
示例 3:

输入:seats = [[“#”,“.”,“.”,“.”,“#”],
[“.”,“#”,“.”,“#”,“.”],
[“.”,“.”,“#”,“.”,“.”],
[“.”,“#”,“.”,“#”,“.”],
[“#”,“.”,“.”,“.”,“#”]]
输出:10
解释:让学生坐在第 1、3 和 5 列的可用座位上。

提示:

seats 只包含字符 ‘.’ 和’#’
m == seats.length
n == seats[i].length
1 <= m <= 8
1 <= n <= 8

这题实在是不会,读者可以看看灵神的题解:教你一步步思考动态规划:从记忆化搜索到递推

题解代码如下:

class Solution {
public:
    int maxStudents(vector<vector<char>> &seats) {
        int m = seats.size(), n = seats[0].size();
        vector<int> a(m); // a[i] 是第 i 排可用椅子的下标集合
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (seats[i][j] == '.') {
                    a[i] |= 1 << j;
                }
            }
        }

        vector<vector<int>> memo(m, vector<int>(1 << n, -1)); // -1 表示没有计算过
        function<int(int, int)> dfs = [&](int i, int j) -> int {
            int &res = memo[i][j]; // 注意这里是引用
            if (res != -1) { // 之前计算过
                return res;
            }
            if (i == 0) {
                if (j == 0) {
                    return res = 0;
                }
                int lb = j & -j;
                return res = dfs(i, j & ~(lb * 3)) + 1;
            }
            res = dfs(i - 1, a[i - 1]); // 第 i 排空着
            for (int s = j; s; s = (s - 1) & j) { // 枚举 j 的子集 s
                if ((s & (s >> 1)) == 0) { // s 没有连续的 1
                    int t = a[i - 1] & ~(s << 1 | s >> 1); // 去掉不能坐人的位置
                    res = max(res, dfs(i - 1, t) + __builtin_popcount(s));
                }
            }
            return res;
        };
        return dfs(m - 1, a[m - 1]);
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/272035.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

解析d3dx9_43.dll文件,有效修复d3dx9_43.dll文件丢失

最近有小伙伴给小编反映说他的电脑老是出现d3dx9_43.dll文件丢失的问题&#xff0c;问为啥会这样&#xff1f;要怎么解决&#xff1f;那么今天小编就来给大家详细的解析这个d3dx9_43.dll文件吧&#xff0c;同时教大家如何去进行修复。 一. d3dx11_43.dll是什么文件有啥用 1.d3…

【数据库系统概论】第3章-关系数据库标准语言SQL(3)

文章目录 3.5 数据更新3.5.1 插入数据3.5.2 修改数据3.5.3 删除数据 3.6 空值的处理3.7 视图3.7.1 建立视图3.7.2 查询视图3.7.3 更新视图3.7.4 视图的作用 3.5 数据更新 3.5.1 插入数据 注意&#xff1a;插入数据时要满足表或者列的约束条件&#xff0c;否则插入失败&#x…

SpringBoot整合jwt(小白入门)

本文项目所用版本为&#xff1a; https://blog.csdn.net/weixin_39570751/article/details/133386557 代码仓库: https://gitee.com/skyblue0678/springboot-demo 目录 什么是JWT JWT依赖 写一个jwt工具类 测试一下jwt 优化&#xff1a;将过期时间配置在文件中 答疑&…

mysql根据条件修改字段

数据 sql语句 根据field2 字段情况&#xff0c;修改field1字段 update t1 tt1 set tt1.field1 ( case when tt1.field2 in (我家2) then 1111 when tt1.field2 in (你的家11) then 2222 else tt1.field2 end )结果

ros2+python,报错:`GLIBCXX_3.4.30‘ not found

在执行代码import rclpy&#xff0c;出现如下图所示报错 如报错信息所示&#xff0c;/home/shui/miniconda3/envs/ros2/bin/…/lib/libstdc.so.6中没有找到GLIBCXX_3.4.30’ 检查/home/shui/miniconda3/envs/ros2/bin/…/lib/的libstdc.so.6文件 cd /home/shui/miniconda3/e…

7. Resource database in UVM(UVM的资源数据库)

UVM集中资源数据库用于存储可配置&#xff08;configurable&#xff09;对象/object、变量/variables、虚拟接口/virtual interfaces、队列/queues、类句柄/class handles等&#xff0c;并从数据库中检索它们。这种可配置的测试平台为验证工程师提供了一定程度的自由度&#xf…

sqlmap各个命令的解释及其基本用法

各个命令的用法 -h,--help Show basic help message and exit(显示基本帮助消息并退出) -hh Show advanced help message and exit&#xff08;显示高级帮助信息并退出&#xff09; --version Show programs version number and exit&#xff08;显示程序的版本…

【Vue UI组件库】

Vue UI组件库 1 移动端常用UI组件库2 PC端常用UI组件库2.1 Element UI 1 移动端常用UI组件库 Vant&#xff1a;https://youzan.github.io/vantCube UI&#xff1a;https://didi.github.io/cube-uiMint UI&#xff1a;http://mint-ui.github.io 2 PC端常用UI组件库 Element U…

带你学C语言~指针(3)

目录 ✍0.前言 &#x1f680;1.字符指针变量 &#x1f685;2.数组指针变量 &#x1f431;‍&#x1f3cd;2.1.数组指针变量是什么 &#x1f431;‍&#x1f3cd;2.2数组指针变量怎么初始化 &#x1f6a2;3.二维数组传参的本质 &#x1f680;4.函数指针变量 ✈4.1函数指…

Ubuntu-22.04编译安装FLTK

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、FLTK是什么&#xff1f;二、下载源代码三、准备编译环境四、编译五、运行测试程序六、Demo总结 前言 最近在研究FLTK&#xff0c;突然对它感了兴趣&#x…

猫粮选择困难?5款性价比高的主食冻干品牌推荐

近年来&#xff0c;冻干猫粮作为热门的高品质猫粮&#xff0c;受到了许多追求纯天然、健康食品的铲屎官的关注。萌新铲屎官就很疑惑了冻干猫粮可以代替猫粮作为主食吗&#xff1f;冻干猫粮真就那么好吗&#xff1f; 那么今天作为一个宠物店店长&#xff0c;跟大家一起聊聊各种…

UG模型的显示与隐藏

在UG中&#xff0c;除了通过图层的方式控制模型的显示与隐藏外&#xff0c;还可以直接通过显示与隐藏命令&#xff0c;位置在菜单-编辑-显示与隐藏&#xff0c;需要注意的是这些命令只能对可视图层中的模型进行控制 显示与隐藏&#xff1a;ctrl w 可以通过模型的类别&#xf…

系统架构设计师笔记

第1章计算机组成与体系结构 1.1.1计算机硬件的组成 &#xff08;1&#xff09;控制器。控制器是分析和执行指令的部件&#xff0c;也是统一指挥并控制计算机各部件协调工作的中心部件&#xff0c;所依据的是机器指令。控制器的组成包含如下。 ①程序计数器PC&#xff1a;存储下…

忻府区政协主席郭新和带队视察洁晋发电环保教育基地中国流动科技博物馆展厅

忻府区政协主席郭新和带队视察洁晋发电环保教育基地中国流动科技博物馆展厅 2023年12月5日&#xff0c;忻府区政协主席郭新和带队视察中国流动科技博物馆展览情况。 郭新和一行来到位于忻州市洁晋发电有限公司环保教育基地的中国流动科技馆忻府区展厅。展厅内配备了科普知识展…

2023 年备受瞩目的向量数据库赛道盘点出炉

近日&#xff0c;Zilliz 捷报频传&#xff0c;先后斩获来自极客公园、量子位、界面科技、OSCHINA 等行业头部媒体所颁发的奖项以及荣登相应榜单。 接下来&#xff0c;就让我们一起来了解一下这些颇受业界认可的奖项及榜单&#xff5e; 2023 中国创新力量 50 榜单 【2023 中国创…

托盘在线缠绕机

托盘在线式缠绕机是适应流水线作业的包装机械&#xff0c;很适合现代化企业的自动化包装的需要&#xff0c;对提高包装效率&#xff0c;降低劳动强度&#xff0c;有效利用人力资源&#xff0c;起到较好的作用。目前&#xff0c;托盘在线缠绕机已经在化工、电子、食品、饮料、造…

小李的2023年度读书盘点

小李的2023年度读书盘点 主题读书 1、纪实文学 和去年一样&#xff0c;依然以上海译文出版社的“译文纪实”系列图书为主。该系列大部分图书质量说得过去&#xff0c;今年读的几本中&#xff0c;一本不及格&#xff08;3/5星以下&#xff09;&#xff0c;《打工女孩》&#…

Facebook企业户与个人户的区别是什么?一文带你看懂Facebook企业户!

Facebook 作为最大的社交平台之一&#xff0c;吸引了大多数的卖家进行投放广告&#xff0c;并且投放广告的效果也是很不错的。Facebook个人账户大家都不陌生&#xff0c;那么 Facebook 有企业户吗&#xff1f;当然是有的&#xff0c;Facebook 有针对企业和品牌的专门广告账户&a…

10 种最佳排序算法原理及代码

什么是排序算法? 从本质上讲&#xff0c;排序算法是一种计算机程序&#xff0c;它将数据组织成特定的顺序&#xff0c;例如字母顺序或数字顺序&#xff0c;通常是升序或降序。 排序算法能干啥? 排序算法主要用于以有效的方式重新排列大量数据&#xff0c;以便更容易地进行搜…

围栏中心点

后端返回的数据格式是 [{height: 0,lat: 30.864277169098443,lng:114.35252972024682}{height: 1,lat: 30.864277169098443,lng:114.35252972024682}.........]我们要转换成 33.00494857612568,112.53886564762979;33.00307854503083,112.53728973842954;33.00170296814311,11…