我有一个编号元素1到N的列表,它们适合从1开始的数字行的位置。我也有这些元素的约束:
我的目标是返回一个整数,表示元素1和元素N之间的最大跨度。如果没有可能的阵容,则返回-1,如果元素可以相距任何距离,则返回-2。
我得到了:
示例输入为:4个元素,withinArray [1] [3] = 10,withinArray [2] [4] = 20,atLeastArray [2] [3] = 3.(所有其他数组值均为零) )。
此输入的返回值为27.(位置1的元素1,位置8的元素2,位置11的元素3和位置28的元素4)
到目前为止,我已经想出了这个:
for (int i = 1; i < n; i++) {
for (int j = 1; j < atLeastArray.length; j++)
if (j == i)
positions[i] = positions[j] - atLeastArray[i][j];
for (int j = 1l j < withinArray.length; j++)
if (j == i)
positions[j] = positions[i] + withinArray[i][j];
}
return positions[n] - positions[1];
这给了我给出的示例的正确答案,但我不相信它在每种情况下都有效,并且我不确定如何在不可能的情况下定义案例或者如果元素可以是任何距离分开。
答案 0 :(得分:0)
让我们从线性规划的角度考虑这个问题。我们有变量x_1,...,x_n和一堆x_i&lt; = x_(i + 1),x_i - x_j&lt; = w_ {ij}和x_i - x_j&gt; = a_(ij)形式的约束)。
注意当我们对变量进行Fourier-Motzkin消除时会发生什么 - 也就是说,在它出现的每个方程中将其隔离,形成两组不等式,比如x_i&lt; = foo_k用于各种k和x_i&gt; ; = bar_l用于各种l,然后删除涉及x_i的所有约束,并用每个k和l的约束bar_l&lt; = foo_k替换它们。
您将获得与之前相同形式的更多约束!请注意,如果您知道x_i - x_j&lt; = a和x_i - x_j&lt; = b,您可以得出结论x_i - x_j&lt; = min(a,b)并忘记之前的两个约束。所以你永远不会需要超过n ^ 2个约束。
所以只需消除除x_1和x_n之外的所有变量。最后你会有两个约束,即x_n - x_1&gt; = a和x_n - x_1&lt; = b。检查一个&lt; = b,那个b不是无穷大,你应该好。
呃,如果有人可以教我如何在这件事上写数学,我将不胜感激:)