【问题标题】:Route to cross matrix gathering a maximum sum路由到交叉矩阵收集最大和
【发布时间】:2014-02-06 13:36:45
【问题描述】:

所以我在翻书时偶然发现了一个有趣的问题。 你得到一个 N*M 矩阵,你必须从坐标 (1,1) 到 (n,m)。

给你三种类型的“操作”来交叉矩阵。

'A'- You go from i,j to i+1,j

'B'- You go from i,j to i,j+1

'C'- You go from i,j to i+1,j+1

每次你越过一个元素,你就把它加到你的“总和”中。您被要求:

  1. 找出你能收集到的最大数量。
  2. 在不使用/重新使用 N*M 矩阵的情况下重建路线。

我没有解决 (1) 动态编程的问题,但是 (2) 让我陷入了困境。这本书对第(2)点没有任何解释。想知道你们中是否有人遇到过类似的事情。

【问题讨论】:

  • econstruct the rout 更准确地说是什么意思?一系列 A、B 和 C?
  • 您可以将问题简化为 DAG 中的最短路径问题(根据定义,它没有负循环),只需使用 Bellman-Ford 算法在 -1*X 上找到最短路径(X 是你的矩阵)。
  • @Mihai Bratulescu 重建路线意味着打印您从 (1,1) 到 (n,m) 的一系列动作
  • @amit Belman-Ford 也是动态编程方法。这只是一个流行的。我并不是说你的评论是错误的,但我只是说 OP 可能正在使用它(没有意识到)。使用 Bellman-Ford 恢复解决方案与我相信的任何其他 DP 一样困难(恕我直言,一点也不难)。
  • @IvayloStrandjev 这就是为什么它是评论而不是答案。它对问题给出了不同的看法,可能对 OP 有所帮助,但它没有回答问题。

标签: algorithm


【解决方案1】:

DP 的一般经验法则:如果除了获得最优值之外还需要重构最优解,请使用第二个数组。第二个数组的大小应该与您存储子问题答案的数组的大小完全相同。然而,在这个数组中,不是存储答案,而是存储导致最佳解决方案的子问题的一些标识。在您的情况下,标识将是 ABC,以表明您进行了哪一步。

【讨论】:

    【解决方案2】:

    您可以仅使用子问题解决方案数组(我们称之为D)来重构路径本身,而无需任何其他数组。只需使用以下规则从(n, m) 向后移动到(1, 1)

    • 如果D[i][j] == D[i - 1][j],将(i-1, j)添加到答案序列的开头
    • 如果D[i][j] == D[i][j - 1],将(i, j - 1)添加到答案序列的开头
    • 否则将 (i - 1, j - 1) 添加到答案序列的开头。

    您可以轻松证明(记住
    D[i][j] = M[i][j] + max(D[i - 1][j], D[i][j - 1], D[i - 1][j - 1]),
    其中M 是初始矩阵),这将导致您到达 (1, 1),并且结果序列确实是最大和路径。

    【讨论】:

      猜你喜欢
      • 2015-12-14
      • 2017-05-23
      • 1970-01-01
      • 1970-01-01
      • 2015-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多