我有一个 1 到 n 的数组,每个 n 包含 m 个元素。我有另一个对称 n X n 矩阵 b ,包含数组之间的距离。我想从每个数组x 1 到x n 中选择一个元素,限制为以下约束。 (a 1 是一个数组,x 1 取自 1 的单个值)
一个例子
a1 = [1, 2, 3, 8, -1, -1, 0, -1]
a2 = [1, 2, 4, 0, -1, 1, 10, 11]
b = |0, 2|
|2, 0|
所选值为x 1 = 8且x 2 = 4.可以注意到我们没有从第二个中选择10或11,因为最接近的可能其中任何一个的值都只是0。
现在,当我只有两个数组时,我可以在O(n 2 )时间在java中执行以下操作,我想,找到最大总和, 12 在这种情况下。如何为超过2个阵列实现更好的解决方案?
int[][] a = new int[][]{{1, 2, 3, 8, -1, -1, 1, -1}, {1, 2, 4, 0, -1, 1, 10, 11}};
int[][] b = new int[][]{{0, 2}, {2, 0}};
int maxVal = Integer.MIN_VALUE;
for (int i = 0; i < a[0].length; i++) {
for (int j = Math.max(i - b[0][1], 0); j < Math.min(a[1].length, i + b[0][1]); j++) {
maxVal = Math.max(maxVal, a[0][i] + a[1][j]);
}
}
System.out.println("The max val: "+maxVal);
答案 0 :(得分:2)
这里不能使用动态编程,因为没有最佳子结构:b_1n条目可能会破坏从x_1到x_ {n-1}的高价值路径。所以一般来说可能很难避免指数时间。但是,对于一组合理限制选择的b_ij,有一种直截了当的回溯方法应该具有合理的性能:
识别最受约束的阵列对性能至关重要:它构成了模糊信念传播的一种形式,有效地修剪了与先前选择所必需的当前选择不相容的未来选择。根据您期望的输入类型,根据可实现的分数进行进一步的优先级排序/修剪可能是有价值的。
我的35行Python实现,给定10x10小整数随机矩阵,b_ij为常数2,在几秒钟内运行。 b_ij = 3(允许每对数组的10个值中最多7个!)花了大约一分钟。