深度优先+剪枝
每一行无非翻或者不翻,把所有情况遍历
只在沉底时,看结果是否满意(计算并更新每种情况最多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)

京公网安备 11010502036488号