【问题标题】:How to find the longest sequence in a 2d array?如何在二维数组中找到最长的序列?
【发布时间】:2018-11-21 03:30:05
【问题描述】:

给定一个二维网格,具有以下约束,我想找到最长的子序列:

  1. 允许向上、向右、向左、向下、对角移动
  2. 当前值与下一个值的差值应大于或等于 3(即绝对差值)。
  3. 不应重复访问的单元格
  4. 网格最大可以是 10 x 10
  5. 在下面的例子中不允许做 4 -> 9

例子:

824
061
379

上述输入的最长路径长度为8,序列为9,1,6,2,8,0,7,3

我厌倦了使用多个 for 循环,但这会非常低效。我想知道如何使用动态编程。任何帮助将不胜感激。

【问题讨论】:

  • 如果你想使用动态规划,你需要先定义一个与基本情况的递归关系。这应该不是很难,因为您已经感觉到相同的子问题被多次调用
  • Pham,我已经编辑了这个问题。它实际上大于或等于 3。
  • 这在我看来像是en.wikipedia.org/wiki/Longest_path_problem 的变体。所以可能没有有效的解决方案。
  • 为什么不进行深度优先搜索而不是动态规划?
  • 显然我认为它无法通过动态规划来解决,因为所有子问题都彼此不同。例如,我们想查找以27 开头的序列。乍一看,似乎对2 降低一步,对7 提高一步将调用相同的子问题,即start with 6,但实际上它不是同一个子问题,因为如果我们从2 开始,那么2 被访问,所以我们不能再选择 2,如果我们从 7 去,那么 7 被访问,我们不能再选择 7

标签: algorithm recursion data-structures dynamic-programming


【解决方案1】:

只需按照约束从网格中每个可能的来源运行bfs (Breadth-first search)。例如,在您给定的示例输入中,可能的源数为 9。然后,将路径保存在一些合适的数据结构中。保存路径后,检查哪条路径最长,这就是你的答案。

【讨论】:

    猜你喜欢
    • 2018-03-26
    • 2011-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    • 2013-05-03
    • 1970-01-01
    相关资源
    最近更新 更多