# 当前所选择的列 所选的列数总和 defdfs(c: int, total: int, s: list): if total == numSelect: h.append(list(s)) return
if c < 0or c >= n: return # 不取当前的c 直接下一层dfs dfs(c + 1, total, s) s.append(c) # 取当前的c total+1 然后下一层 dfs(c + 1, total + 1, s) s.remove(c)
dfs(0, 0, [])
# 计算被覆盖的行数 defcountAns(): res = 0 for i inrange(m): flag = True for j inrange(n): if matrix[i][j] == 1: flag = False break res = res + flag return res
ans = 0 # 这里注意一定要用深拷贝 # python数组都是地址调用 否则后续对martrix的修改会直接影响到back数组 这样对martix进行备份也就没有意义了 back = copy.deepcopy(matrix)
# 然后根据所有 枚举出来的列的组合进行模拟 for arr in h: for c in arr: for i inrange(m): matrix[i][c] = 0 ans = max(ans, countAns()) # 这里用深拷贝的原因与之前相同 matrix = copy.deepcopy(back) return ans
ans = 0 # 枚举所有列的组合 for arr in h: tmp = 0 for i inrange(m): flag = True for j inrange(n): # 对每行元素进行判断 如果当前列为1 且当前列并在枚举的列的集合 # flag置为false 即该行没有被覆盖 if matrix[i][j] == 1and arr.count(j) == 0: flag = False break tmp = tmp + flag ans = max(ans, tmp)
classSolution: defmaximumRows(self, matrix: List[List[int]], numSelect: int) -> int: m, n = len(matrix), len(matrix[0]) # 用于代表原矩阵 # i行 其中二进制 就代表原矩阵的0 1分布 arr = m * [0]
for i inrange(m): for j inrange(n): if matrix[i][j] == 1: # 第i行 第j列为1 则直接mask[i] | 2^j-1 即将mask[i]的第j位置为1 arr[i] |= 1 << j
# 一共n列 h = 1 << n
ans = 0
# 枚举所有列选举的方案 for s inrange(h): # 如果当前枚举的方案中的列数符合题目要求 则进行判断 if s.bit_count() == numSelect: tmp = 0 for row in arr: # 如果row为s的子集 即代表row中1 都可以被枚举方案s 中的列覆盖 if row & s == row: tmp = tmp + 1 ans = max(ans, tmp)