动态编程矩阵练习

时间:2016-06-14 12:44:11

标签: algorithm dynamic-programming

我正在练习动态编程,我正在尝试解决此练习http://www.geeksforgeeks.org/collect-maximum-points-in-a-grid-using-two-traversals/ 但我无法理解如何使用动态编程。

我的理由是使用表T[n][m]来存储结果,并在每个单元格中找到要去的最大值(对应于一个单元格)。

使用链接中显示的示例:我如何知道第一个单元格[0][0]是否转到“3”而不是“5”?使用我的推理选择是去“5”,但这是一个糟糕的方式

1 个答案:

答案 0 :(得分:0)

根据您的建议,您应该用于展望未来。这听起来更像是贪婪的方法,这确实是不正确的。而是使用从先前迭代计算的内容在当前迭代中进行计算。

简化我会将算法描述为:

  • 初始化表格T[C][C]并初步将所有值设置为0.其中C是列数。
  • T[c1][c2]在前一行中保留最佳分数,其中,旅行者1将在列c1中,而旅行者2将在列c2
  • 然后你可以迭代行:
    • 检查行r行是否可以在c1c2
    • 填写新表tmp,其中tmp[c1][c2]arr[R][c1] + arr[R][c2] + Max(T[c1-1][c2-1]T[c1][c2-1], ..., T[c1+1][c2+1])
    • T替换为tmp
  • 结果:T[0]+T[C-1]

备注:如果旅行者都在同一地点并且他们都没有获得积分,我没有注意这个案例。我假设这是在检查中处理的,因为我们应该能够在所有行的最优解c1 < c2中证明。 (C = 1时除外)

为什么这是正确的:

在行R处,从前一行开始只有9(3x3)种组合。对于每个可能的位置,我们总是采取最好的。这意味着我们实际上正在为两位旅行者尝试所有可能的组合,我们不能错过任何更好的解决方案

要结束,此算法不会为您提供最佳解决方案的路径,只会获得最佳分数。您可能会对此感到困惑,因为您直观地寻找路径。

附加

是否也可以使用此算法获取路径?

,但您需要做一些额外的工作。 假设我们保留所有行的所有计算T数组。 然后我们可以检查以下内容:

  • T[R][c1][c2] == arr[R][c1] + arr[R][c2] + T[R-1][c-1][c-2]
  • 如果在前一行中两位旅行者都向右走,则检查是否可以获得最佳路径。通过这种方式,我们可以走回到起始位置。