给出一个整数数组,需要将其拆分为四个整数 使得XOR的总和最大。
I / P-[1,2,1,2,1,2]
O / P-9
说明:Box1-[1,2] Box2-[1,2] 方格3-[1,2] Box4-[]
我尝试使用递归,但由于 时间复杂度是指数级的。我期待使用动态的解决方案 编程。
def max_Xor(b1,b2,b3,b4,A,index,size): if index == size: return b1+b2+b3+b4 m=max(max_Xor(b1^A[index],b2,b3,b4,A,index+1,size), max_Xor(b1,b2^A[index],b3,b4,A,index+1,size), max_Xor(b1,b2,b3^A[index],b4,A,index+1,size), max_Xor(b1,b2,b3,b4^A[index],A,index+1,size)) return m def main(): print(max_Xor(0,0,0,0,A,0,len(A)))
预先感谢!
答案 0 :(得分:2)
有几件事可以加快算法的速度:
最后一项可能是最大的节省。例如,如果最长的数字包括几个5位和4位数字,那么在您将这些数字适当地放入框中之前,考虑短的数字是没有意义的,从而获得前导比特的最大优势。仅用四个框,您不能从3位数字中得到一个数字,该数字控制着一个错位的5位数字。
您的目标是将奇数个5位数字放入3个或全部4个盒子中;与此相对,仅检查此值是否“模拟”了剩余数字的第4位。例如,给定六个5位数字(范围为16-31)和少量的小数字(0-7),您的首要考虑是仅处理将5位数字除以(3、1、1, 1),因为这会使每组中有价值的5位打开。
在输入中混合使用更均匀的值时,您还需要考虑如何为类似的“保持奇数”启发式分布4位。请注意,当您从大到小工作时,您只需要担心保持奇数并观看接下来的内容即可。
这些技术应可使您修剪递归以及时完成。
答案 1 :(得分:0)
我们可以在此处使用动态编程将问题分解为较小的集合,然后将其结果存储在表中。然后使用已存储的结果来计算更大集合的答案。 例如:
Input -- [1,2,1,2,1,2]
我们需要将数组连续分成4个方框,以使所有方框的XOR之和最大。 让我们以您的测试用例,将问题分解为较小的集合,然后开始求解较小的集合。
box = 1, num = [1,2,1,2,1,2]
ans = 1 3 2 0 1 3
由于我们只有一个框,所以所有数字都将放入该框。我们将把这个答案存储在一个表中。让我们将矩阵称为DP。
DP[1] = [1 3 2 0 1 3]
DP[i][j] stores answer for distributing 0-j numbers to i boxes.
现在让我们假设有两个盒子,我们将一个接一个地取数字。
num = [1] since we only have one number it will go into the first box.
DP[1][0] = 1
让我们添加另一个号码。
num = [1 2]
现在有两种方法可以将新号码输入框中。
case 1: 2 will go to the First box. Since we already have answer
for both numbers in one box. we will just use that.
answer = DP[0][1] + 0 (Second box is empty)
case 2: 2 will go to second box.
answer = DP[0][0] + 2 (only 2 is present in the second box)
这两种情况的最大值将存储在DP [1] [1]中。
DP[1][1] = max(3+0, 1+2) = 3.
现在num = [1 2 1]。 同样,对于新数字,我们有三种情况。
box1 = [1 2 1], box2 = [], DP[0][2] + 0
box1 = [1 2], box2 = [1], DP[0][1] + 1
box1 = [1 ], box2 = [2 1], DP[0][0] + 2^1
这三个数中的最大值将作为DP [1] [2]的答案。
类似地,我们可以找到num = [1 2 1 2 1 2] box = 4的答案
1 3 2 0 1 3
1 3 4 6 5 3
1 3 4 6 7 9
1 3 4 6 7 9
还要注意a xor b xor a = b
。您可以使用此属性按注释中的建议在恒定时间内获取数组段的异或。
这样,您可以将问题分解成较小的子集,并使用较小的集合答案来计算较大的答案。希望这可以帮助。理解了这一概念之后,您可以比指数更快地实施它。
答案 2 :(得分:0)
我会从最高位到最低位一点一点地走。对于每一位,请尝试分配已设置该位的仍未使用的数字的所有组合,以使每个框中都有奇数个数字,其他都没有关系。选择总体最佳路径。使这种贪婪方法复杂化的一个问题是,设置了较低位的两个框可以等于设置了下一个较高位的框。
或者,将递归中的框状态记为有序元组。