我正在练习动态编程,我正在尝试解决此练习http://www.geeksforgeeks.org/collect-maximum-points-in-a-grid-using-two-traversals/ 但我无法理解如何使用动态编程。
我的理由是使用表T[n][m]
来存储结果,并在每个单元格中找到要去的最大值(对应于一个单元格)。
使用链接中显示的示例:我如何知道第一个单元格[0][0]
是否转到“3”而不是“5”?使用我的推理选择是去“5”,但这是一个糟糕的方式
答案 0 :(得分:0)
根据您的建议,您应该不用于展望未来。这听起来更像是贪婪的方法,这确实是不正确的。而是使用从先前迭代计算的内容在当前迭代中进行计算。
简化我会将算法描述为:
T[C][C]
并初步将所有值设置为0.其中C
是列数。T[c1][c2]
在前一行中保留最佳分数,其中,旅行者1将在列c1
中,而旅行者2将在列c2
r
行是否可以在c1
,c2
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]