Java 在矩阵上查找路径以获得最大值

Java 在矩阵上查找路径以获得最大值,java,algorithm,computer-science,Java,Algorithm,Computer Science,我知道,这是一个老问题,如果给定一个矩阵,如: [1 1 2 3, 2 3 4 4, 3 4 1 3, 2 1 3 4] 从给定位置开始,从右到左,只向右或向上或向下移动,不能以相同的方式返回并在右侧停止,找到一条路径以获得最大值 我正在考虑使用DP(可能需要尝试所有可能的路径并计算值),但它似乎将花费大量内存,因为它存储了所有可能的解决方案,并且可能速度较慢 我想知道是否还有其他的想法或方法可以做出更好的解决方案?如果可能,更快的解决方案?如果要优化内存,可以尝试回溯。这将只涉及存储当

我知道,这是一个老问题,如果给定一个矩阵,如:

[1 1 2 3,
 2 3 4 4,
 3 4 1 3,
 2 1 3 4]
从给定位置开始,从右到左,只向右或向上或向下移动,不能以相同的方式返回并在右侧停止,找到一条路径以获得最大值

我正在考虑使用DP(可能需要尝试所有可能的路径并计算值),但它似乎将花费大量内存,因为它存储了所有可能的解决方案,并且可能速度较慢


我想知道是否还有其他的想法或方法可以做出更好的解决方案?如果可能,更快的解决方案?

如果要优化内存,可以尝试回溯。这将只涉及存储当前路径以及最佳解决方案的路径和值

大纲是:

  • 存储步骤列表(右、上、下)
  • 可以说,你先深入,如果可以的话,试着迈出新的一步
  • 如果不能,只需返回一个方向并将步骤更改为下一个可能的方向。(如果此路径优于以前存储的路径,请存储它)
  • 如果步骤没有下一个可能的方向,重复3
  • 如果所有可能性都已用尽,请返回存储的最佳路径

  • 回溯维基百科:

    如果你想优化内存,你可以尝试回溯。这将只涉及存储当前路径以及最佳解决方案的路径和值

    大纲是:

  • 存储步骤列表(右、上、下)
  • 可以说,你先深入,如果可以的话,试着迈出新的一步
  • 如果不能,只需返回一个方向并将步骤更改为下一个可能的方向。(如果此路径优于以前存储的路径,请存储它)
  • 如果步骤没有下一个可能的方向,重复3
  • 如果所有可能性都已用尽,请返回存储的最佳路径

  • 回溯维基百科:

    我认为有一种方法可以完成DP,但我无法很快找到它。因为到目前为止还没有人回答这个问题,所以我将给出一个图表方法。创建一个有向图,其中从a到B的边将等于该顶点中的数字。从您的描述中可以清楚地看出,它不会有任何循环。您将得到这样的网格图,但仅定向:

    现在获取一个位于右侧某处的顶点源,并将其连接到第一层(将所有边设置为0)。目的地也一样,但它在左边


    现在运行

    我认为有一种方法可以完成DP,但我无法很快找到它。因为到目前为止还没有人回答这个问题,所以我将给出一个图表方法。创建一个有向图,其中从a到B的边将等于该顶点中的数字。从您的描述中可以清楚地看出,它不会有任何循环。您将得到这样的网格图,但仅定向:

    现在获取一个位于右侧某处的顶点源,并将其连接到第一层(将所有边设置为0)。目的地也一样,但它在左边


    <>现在运行

    编写如何考虑使用DP?提供有关您的解决方案的更多详细信息。正如现在所说的,看起来你可以在这里使用DP,只是增加了一个关于DP的句子,看起来不错。但是,贪婪算法不能被使用,因为可能一个地方有太大的价值,所以DP是唯一的方法。这不告诉你“如何考虑使用DP”。如果你有某处开始,某处结束。(检查点)我认为BFS也是这样。你从哪里开始?根据你的描述,你可以从右边开始任何地方,然后在左边的任何地方完成。这是正确的吗?写下你认为如何使用DP?给你的解决方案更多的细节。好的,贪心算法不能被使用,因为可能有一个地方有太大的价值,所以DP是唯一的方法。这不告诉任何关于“你如何考虑使用DP”。如果你有某处开始,某处结束(检查点)。我认为BFS也可以。你从哪里开始?根据你的描述,你可以从右边的任何地方开始,然后从左边的任何地方结束。这对吗?