【发布时间】:2018-05-29 20:35:01
【问题描述】:
对于以下问题,我有一个贪婪的解决方案。我想知道如何证明?
问题如下:给定一个 n x n 非负整数的 2D 矩阵,找到三个单元格,使得这些单元格和相邻单元格的总和为越多越好。如果两个被选中的单元格有共同的相邻单元格,则相邻单元格只参与一次求和,如果两个单元格共享一条公共边,则认为两个单元格相邻。
天真的蛮力解决方案在 O(n6) 中运行。我编写了一个贪婪的解决方案,它在 O(n4) 中运行。贪心解决方案使用了这样一种思想,即自身及其相邻单元格总和最大的单元格始终是答案的一部分。我已经在几个测试用例上测试了这两种解决方案,结果是相同的。
在贪心算法中,首先我选择自身和相邻单元格总和最大的单元格,然后遍历所有可能的单元格对。
现在我的问题是,为什么这种贪婪策略有效?我要证据。谢谢!
【问题讨论】:
-
听起来你可以进一步抽象矩阵,第二个矩阵大小相同,其中单元格的值等于所有相邻单元格的总和。然后从那里,您可以找到彼此不相邻的 3 个最大的销售,不是吗?
-
@Fallenreaper 否。有时我们应该选择相邻的单元格。我想我把问题解释得不好。我必须将语句“每个单元格只能参与一次总和”编辑为“如果两个选定的单元格具有共同的相邻单元格,则相邻单元格只能参与一次总和”。
-
这更有意义。那么问题就变成了:你应该自己建立一个模型。我们可以想出答案,但我们不想在不经意间为你做功课。
-
@Fallenreaper 这不是家庭作业。
标签: algorithm matrix brute-force greedy