假设有一个二维数组位(m x n)
位。二维位数组的最大或值
例如:
1 0 0 1 0
1 0 1 0 0
1 0 1 1 0
0 0 0 0 1
这里,m = 4
,n = 5
。
我可以翻转(0
变成1
,1
变成0
)任何行中的位。当你翻转特定行的位时,你翻转所有的位。
我的目标是获得给定的一对行之间的最大值OR
。
也就是说,如果给定的对行的是(r1, r2)
,那么我可以翻转任意数量的行r1
和r2
之间,我应该找到r1
和r2
之间的所有行的最大可能OR
值。
在上面的例子中(考虑基于1的索引的数组),如果r1
= 1和r2
= 4,我可以翻转第一行得到。现在,如果我找到从1到4的所有行的值为OR
,那么我会得到值31
作为最大可能值OR
值(可能有其他解决方案)。
而且,这将是很好的计算答案(r1, r1)
,(r1, r1+1)
,(r1, r1+2)
,...,(r1, r2-1)
在计算同为(r1,r2)
。
约束
1 <= m x n <= 10^6
1 <= r1 <= r2 <= m
一个简单的蛮力解决方案将有一个O(2^m)
时间复杂度。 有更快的方法来计算这个吗?
这个算法的应用是什么? – bcdan
我不明白你是如何来到O(2^m),如果你一点一点地执行操作,或者O(n^2),那么在行对上的天真迭代宁可是O(m * n^2)如果m <= sizeof(some_machine_integer),因为处理器会并行执行bit,否? –
@ aka.nice由于有m行,我可以选择nC0,nC1,nC2,nC3,...,nCn行进行翻转。现在,nC0 + nC1 + nC2 + nC3 + ... + nCn = 2^n。 –