深度优先+剪枝
每一行无非翻或者不翻,把所有情况遍历
只在沉底时,看结果是否满意(计算并更新每种情况最多1的个数)
深度优先搜索:
继续往左走
继续往右走
剪枝:
计算当前统计结果中1的数目,如果为零,或已经小于存在过的结果,直接退出
翻:二进制否运算
统计1的数量:二进制与运算
import sys sys.setrecursionlimit(4000) try: # 深度优先剪枝 n,m = map(int,input().split(" ")) num = [] for i in range(n): s = input() num.append(s) L = n-1 tag = int('1'*m,2) result = 0 def countmax1(i,num,text): global result count = bin(text).count("1") if count==0 or count<result: # 剪枝 return if i==L: # 沉底更新最终结果 a1 = int(num[i],2) a2 = a1^tag result = max(result,bin(a1&text).count("1"),bin(a2&text).count("1")) return a1 = int(num[i],2) a2 = a1^tag countmax1(i+1,num,text&a1) #不翻下一行 countmax1(i+1,num,text&a2) #翻下一行 return countmax1(0,num,tag) print(result) except Exception as e: print(e)