Leetcode 2023-12-26 题目分享
1349. 参加考试的最大学生数 [Hard] 题解
参加考试的最大学生数
给你一个 m * n
的矩阵 seats
表示教室中的座位分布。如果座位是坏的(不可用),就用 '#'
表示;否则,用 '.'
表示。
学生可以看到左侧、右侧、左上、右上这四个方向上紧邻他的学生的答卷,但是看不到直接坐在他前面或者后面的学生的答卷。请你计算并返回该考场可以容纳的同时参加考试且无法作弊的 最大 学生人数。
示例 1:
1 | 输入:seats = [["#",".","#","#",".","#"], |
示例 2:
1 | 输入:seats = [[".","#"], |
示例 3:
1 | 输入:seats = [["#",".",".",".","#"], |
提示:
seats
只包含字符'.' 和``'#'
m == seats.length
n == seats[i].length
1 <= m <= 8
1 <= n <= 8
思路
- 首先是图上的搜索问题,结合数据量,完全可以 DFS+记忆化搜索解决。
- 但这个问题本质上是“选和不选”:‘1’代表选择这个座位,‘0’代表不选。所以很自然想到状态压缩+DP。
- 对每一行数据进行处理,枚举所有可能的情况:
- 判断这一行是否有效:检查每个‘1’左右是否都为‘0‘
- 枚举前一行的所有情况,判断是否有效:检查当前行每个‘1’的前一行左右是否都为‘0’
- 有效则可以更新 DP 数组
代码
1 | class Solution { |
复杂度分析
- 时间:O( n * 2m * (m + 2m) = n * 4m )。
- 空间:O( 2m )。
类似记得蓝桥杯也很喜欢出这种题
贴一个以前的蓝桥杯真题,也是 DP+状态压缩:玉米田
Comments
Comment plugin failed to load
Loading comment plugin