Day72力扣打卡
2023-12-27 00:38:48
打卡记录
参加考试的最大学生数(压缩状态DP)
class Solution:
def maxStudents(self, seats: List[List[str]]) -> int:
m, n = len(seats), len(seats[0])
# a[i] 是第 i 排可用椅子的下标集合
a = [sum((c == '.') << j for j, c in enumerate(s)) for s in seats]
f = [[0] * (1 << n) for _ in range(m)]
for j in range(1, 1 << n):
lb = j & -j
f[0][j] = f[0][j & ~(lb * 3)] + 1
for i in range(1, m):
j = a[i]
while j: # 枚举 a[i] 的子集 j
f[i][j] = f[i - 1][a[i - 1]] # 第 i 排空着
s = j
while s: # 枚举 j 的子集 s
if (s & (s >> 1)) == 0: # s 没有连续的 1
t = a[i - 1] & ~(s << 1 | s >> 1) # 去掉不能坐人的位置
f[i][j] = max(f[i][j], f[i - 1][t] + f[0][s])
s = (s - 1) & j
j = (j - 1) & a[i]
f[i][0] = f[i - 1][a[i - 1]]
return f[-1][a[-1]]
文章来源:https://blog.csdn.net/qq947467490/article/details/135233064
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!