【问题标题】:How to find all possible reachable numbers from a position?如何从一个位置找到所有可能的可达数字?
【发布时间】:2016-05-14 16:18:58
【问题描述】:

给定2 elements n, s and an array A of size m,其中s is initial position位于1 <= s <= n之间,我们的任务是对s执行m个操作,在每个操作中我们要么使s = s + A[i]要么s = s - A[ i],我们必须打印 m 操作后所有可能的值,并且所有这些值应介于 1 - n(包括)之间。

重要提示:如果在操作过程中我们得到一个值 s n, 我们不会在 s 的值上走得更远。

我使用 BFS 解决了这个问题,但问题是 BFS 方法在这里不是最优的,有人可以向我建议任何其他更优的方法或算法将有很大帮助。

例如:-

如果 n = 3,s = 3,并且 A = {1, 1, 1}

                            3
                         /     \
operation 1:           2         4  (we don’t proceed with 4 as it is > n)
                   /   \         /  \
operation 2:     1       3      3    5
                / \     / \    / \   / \
operation 3:   0   2   2   4  2   4  4  6

因此,按照上述规则可达到的最终值是 2 和 2(即 2 的两倍)。我们不考虑第三个,因为它有一个 > n 的中间状态(如果

【问题讨论】:

  • 您能否确认您以正确的方式引用了mn,并且有时没有使用错误的引用?看起来你在某个时候把它们弄混了。
  • 我说得对,告诉我你哪里有困惑?
  • 令我困惑的是数组的大小是m,但你永远不能访问n以上的元素。所以如果n < m 那么数组的最后一项是无用的。如果n > m,那么s = n 怎么办,因为n-1 可能没有数组元素?另外,我不明白i 来自A[i]
  • 我们有 m 个操作,数组大小为 m,在每个操作中我们访问数组的第 i 个值(其中 0= 0。
  • 我现在更加困惑:数组大小是一?你能提供你试过的代码吗?

标签: algorithm data-structures dynamic-programming


【解决方案1】:

有这个动态规划方案,运行在O(nm)时间,需要O(n)空间。

首先建立一个名为reachable的布尔数组,将其初始化为false,除了reachable[s],即true

这个数组现在表示一个数字是否可以在0 步骤中到达。现在对于从1m 的每个i,我们更新数组,以便reachable[x] 表示在i 步骤中是否可以访问数字x。这很简单:当且仅当x - A[i]x + A[i]i - 1 步骤中可以到达时,x 可以在i 步骤中到达。

最后,数组成为你想要的最终结果。


编辑:这里是伪代码。

// initialization:
for x = 1 to n:
    r[x] = false
r[s] = true

// main loop:
for k = 1 to m:
    for x = 1 to n:
        last_r[x] = r[x]
    for x = 1 to n:
        r[x] = (last_r[x + A[k]] or last_r[x - A[k]])

如果x 不在[1 .. n] 范围内,这里last_r[x] 按照惯例是false

如果您想保持每个数字可以达到的方式数量,那么您进行以下更改:

  1. 将数组r改为整数数组;
  2. 初始化时,将所有r[x]初始化为0,除了r[s]改为1
  3. 在主循环中,将关键行改为:

    r[x] = last_r[x + A[k]] + last_r[x - A[k]]

【讨论】:

  • 能否提供一个简单的伪代码,我有点困惑
  • 这段代码是否也记录了一个值的计数,就像上面的例子 2 发生了两次一样。
  • @Godfather 查看我的编辑。一旦你了解它是如何工作的,这只是一个轻微的修改。
  • 我认为您的解决方案存在一个问题,在上面的示例中,我们可以通过三种方式达到 2,但我们不会考虑一二,因为它位于 4 之后(即 > n)。
  • @Godfather 我认为“到达”意味着到达最后,即在所有 m 步骤之后。如果您认为所有中间步骤也可以到达,那么只需保留另一个数组 s,它会在每个步骤中累积 r 的总和。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-04
  • 1970-01-01
  • 2021-01-02
  • 2011-06-05
  • 2017-04-05
  • 1970-01-01
相关资源
最近更新 更多