【发布时间】:2017-12-28 13:56:26
【问题描述】:
假设有一个二维数组(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 之间翻转任意数量的行,并且我应该找到之间所有行的最大可能OR 值r1 和 r2。
在上面的例子中(考虑索引从 1 开始的数组),如果r1 = 1 和r2 = 4,我可以翻转第一行得到0 1 1 0 1。现在,如果我找到从 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)。
有没有更快的计算方法?
【问题讨论】:
-
这个算法有什么应用?
-
我不明白你是怎么得到 O(2^m) 的,如果你一点一点地执行操作,对行对的天真迭代宁愿是 O(m*n^2),或者 O(n^2) 如果 m
-
@aka.nice 因为有 m 行,我可以选择 nC0, nC1, nC2, nC3, ..., nCn 行来翻转。现在,nC0 + nC1 + nC2 + nC3 + ... + nCn = 2^n。
-
@NikunjMadhogaria 啊,现在我明白了,首先我反转了 m & n,其次,您可以 OR 任意数量的行,而不仅仅是一对行。
标签: algorithm multidimensional-array bit-manipulation dynamic-programming