【问题标题】:Dynamic programming matrix exercise动态规划矩阵练习
【发布时间】:2016-06-14 12:44:10
【问题描述】:

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

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

使用链接中显示的示例:我如何知道在第一个单元格[0][0] 转到 "3" 而不是 "5"?根据我的推理,选择是转到 "5",但这是一个不好的方法

【问题讨论】:

    标签: algorithm dynamic-programming


    【解决方案1】:

    您的表格应该按照您的建议用于向前看。这听起来更像是一种贪婪的方法,实际上是不正确的。而是使用您从先前迭代中计算出的内容在当前迭代中进行计算。

    简化我将算法描述为:

    • 初始化一个表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]
    • 如果在前一行中两个旅行者都向右走,这将检查是否有可能找到最佳路径。这样我们就可以走回起始位置。

    【讨论】:

    • 谢谢。事实上,我贪婪的方法总是让我对动态编程的方法感到困惑。所以:我们有尺寸为 5x4 的arr[][]T[][]4x4(所有单元格设置为 0)和迭代中的tmp[][]4x4。一开始,第一个行程在第 0 列 (are[0][0]),第二个在第 3 列 (arr[0][3]),对吗?所以在Ttmp 中,我们处于[0][3] 的位置。现在我要做的是计算插入T[0][3] 的最佳结果,其中包含我可以做的所有动作的最大值,加上arr[R][c1] + arr[R][c2] 的值arr[3][0] + arr[3][3]。对吗?
    • 不,在我的方法中,我们从上一行中获取了最好的。在第一行没有上一行,所以应该设置的唯一值是T[0][3] = arr[0][0] + arr[0][3]; 当在第二行时,你应该开始根据上一行检查什么是最好的,比如tmp[0][3] = max(T[0][3],T[1][3],T[0][2],T[1][2]) + arr[1][0] + arr[1][3]; 等等..跨度>
    猜你喜欢
    • 2015-06-11
    • 1970-01-01
    • 1970-01-01
    • 2018-04-09
    • 2013-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多