【问题标题】:Dynamic Programming for sub sum elements in a matrix [closed]矩阵中子和元素的动态规划[关闭]
【发布时间】:2015-07-31 20:16:10
【问题描述】:

给定一个有 4 行和n 列的棋盘。每个单元格上都有一个整数。给定2n 光盘中的一部分或全部光盘,您可以将它们放在板上的不同单元格上,以便总和最大。唯一的限制是 2 个圆盘不能垂直或水平相邻。如何使用DP在O(n)的棋盘上放置最佳组合?

【问题讨论】:

  • 所以我说过,对于每一列有 7 种可能的模式(不放置光盘不是一个选项,因为问题说明了其中的一部分)。我制作了一个矩阵 M ,如果我可以将分类为 c 的列(可以是 0 到 6)放在 i+1 列旁边,它将输出 T 或 F 。所以我考虑安排 n 个大小为 7 的优先级队列,队列中的每个元素都是一对分类和来自该分类的数字的总和,就在这里我卡住了
  • 为什么要使用优先队列?尝试考虑如何将其表述为 DP。您希望找到描述如何构建解决方案的重复出现。开始简单:如果我们可以在每列中放置圆盘的位置没有限制,您将如何制定 DP?
  • 所以我想到了 sum(n) = sum(n-1) + max {pik : k from 0 to number of possible patterns} 。 (p - 当前列)问题是每当我需要插入条件时,我不能向后更改整个子问题
  • 对,所以你需要一些方法来知道递归调用中的最后一列是什么......还要注意你需要一种方法来确保你使用的磁盘不超过 2n。
  • 记忆?我总是可以把子问题的分类放在一边,但是如果想改变子问题本身,我该怎么办......好吧,这就是我对这个问题深陷泥潭的地方。我永远不会使用超过 2*n 的光盘,因为我已经计算了所有可能模式的总和。

标签: algorithm dynamic-programming divide-and-conquer bottom-up


【解决方案1】:

第一,我们不可能使用超过 2*n 个磁盘,因为任何列最多可以包含 2 个磁盘。

假设 d[i][mask] - 用磁盘填充从 1 到 i 的列后获得的最大数量,以便最后一列填充为掩码(掩码可以是 0000、0001、0010、0100、0101、1000、 1001 或 1010,其中 1 表示已放置磁盘,0 表示未放置)

所以 d[i][mask1] = max of (d[i-1][mask2] + 通过在第 i 列上应用 mask1 获得的数字),其中 mask2 可以是与 mask1 不矛盾的任何掩码

编辑 1:您无需更改任何内容。当你在某个面具上的第 i 步时,它只取决于 i-1 面具的答案。你已经拥有了所有这些。您只需尝试从有效的 d[i][mask] 中更新当前的 d[i][mask]。正如我已经说过的 d[i][mask] - 存储从 1 到 i 填充列可以获得的最大值,最佳情况是,以便最后一列具有此掩码形式的磁盘(在 i 之前的掩码无关紧要-th 列已填满,因为它们不会影响下一列)

【讨论】:

  • 假设在第 i 列上应用 mask1 获得了一个非常大的数字,并且 mask1 与 mask2 矛盾,我在哪里检查如何更改子问题中的所有内容,以便我可以拥有这个数字在 d[i][mask1] 中?
  • @itorra 更新了我的答案。如果你有一个例子,我可以解释一下
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-09
  • 2011-10-07
  • 2013-11-01
  • 1970-01-01
  • 2021-06-22
相关资源
最近更新 更多