达到数组点的最小步骤

时间:2014-11-08 08:51:45

标签: algorithm

有一个无限的一维数组,范围从(-infinity,infinity)。您目前处于单元格编号0.您的目标是达到单元格编号H.允许两种移动。

 U =向右的步骤(正面)。
 D =左侧的步骤(负侧) 我们必须找到最低数量。移动如果(可能)

对于h = 2 u = 2 d = 1

首先向右移动2步到达2号单元格。然后向左移动1步到达1号单元格,最后向右移动2步到达目标。因此,需要3次移动,这是最小的。

解决这个问题的算法是什么。我的方法是进行递归调用,即h + u和h-d,直到h == 0.

1 个答案:

答案 0 :(得分:2)

m 成为必须向正面移动的一系列动作,以及 n 必须朝向正面移动的一些动作消极的一面。 m n 必须满足以下等式:

h = u * m - d * n

我们知道 h u d 。您的示例的等式将如下所示(我假设 h 应该是3而不是2,请参阅我的评论):

3 = m * 2 - n * 1
->
n = 2 * m  - 3

我们也知道 m > = 0, n > = 0和 m n 是整数。现在,找到 m n 的简单方法是计算 m = 0,1,2的 n ,3,4 ...直到您将收到满足所有条件的 n (您还可以根据 n 计算 m )。在您的示例中,它将是:

m = 0 -> n = -3 is an integer but n < 0 so it is not an answer
m = 1 -> n = -1 is an integer but n < 0 so it is not an answer
m = 2 -> n = 1 

所以答案是 m = 2且 n = 1。您不必检查其他 m 的结果,因为您将始终收到更高的值( h = u * m - d * n 是一个不断增加的功能)。

这不是一切。可能存在没有整数解的方程。在这个局部情形中,我们考虑线性丢番图方程,根据Wikipedia有整数解:

当且仅当 h d u 的最大公约数的倍数

让我们再次回到你的榜样。 2和1的GCD是1,3是1的乘法,因此存在整数解。但是,我们要考虑 h = 9, d = 2且 u = 4。 GCD(2,4)是2而9不是乘法2所以没有解。在尝试查找 m n 之前,您必须检查此情况,否则您将以不定式循环结束。