【发布时间】:2018-11-21 03:30:05
【问题描述】:
给定一个二维网格,具有以下约束,我想找到最长的子序列:
- 允许向上、向右、向左、向下、对角移动
- 当前值与下一个值的差值应大于或等于 3(即绝对差值)。
- 不应重复访问的单元格
- 网格最大可以是 10 x 10
- 在下面的例子中不允许做 4 -> 9
例子:
824
061
379
上述输入的最长路径长度为8,序列为9,1,6,2,8,0,7,3
我厌倦了使用多个 for 循环,但这会非常低效。我想知道如何使用动态编程。任何帮助将不胜感激。
【问题讨论】:
-
如果你想使用动态规划,你需要先定义一个与基本情况的递归关系。这应该不是很难,因为您已经感觉到相同的子问题被多次调用
-
Pham,我已经编辑了这个问题。它实际上大于或等于 3。
-
这在我看来像是en.wikipedia.org/wiki/Longest_path_problem 的变体。所以可能没有有效的解决方案。
-
为什么不进行深度优先搜索而不是动态规划?
-
显然我认为它无法通过动态规划来解决,因为所有子问题都彼此不同。例如,我们想查找以
2和7开头的序列。乍一看,似乎对2降低一步,对7提高一步将调用相同的子问题,即start with 6,但实际上它不是同一个子问题,因为如果我们从2开始,那么2被访问,所以我们不能再选择2,如果我们从7去,那么7被访问,我们不能再选择7
标签: algorithm recursion data-structures dynamic-programming