【发布时间】: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