如何证明这种贪心算法是最优的?

时间:2016-11-14 20:57:48

标签: algorithm greedy

问题听起来像这样:我们得到n个立方体。每个立方体都有一个长度(边长)和一个颜色。边缘的长度是不同的,但是例如,culours不是:任何两个立方体不能具有相同的长度,但可以具有相同的颜色。颜色从1到p(给出p)。

我们必须按照以下规则建造一个具有最大高度的立方体塔:

1)如果立方体具有相同的颜色,则不能将立方体放置在立方体上;

2)立方体不能放在边长较小的立方体上。

例如:cube c1的长度为3,cube c2的长度为5. cube c1可以放在c2的顶部,但是c2的顶部不能放置c1。

好吧,所以我提出的算法是为了解决这个问题:

  1. 我们按边长按降序排序立方体,然后将它们放在一个数组中;
  2. 我们将数组中的第一个立方体添加到塔中;
  3. 我们在变量l中保存最后插入的多维数据集的长度(在本例中,第一个多维数据集的长度);
  4. 我们在变量c中保存最后插入的多维数据集的颜色(在这种情况下,第一个多维数据集的颜色);
  5. 我们遍历数组的其余部分,插入长度小于l且颜色不同于c的第一个立方体,然后我们重复3-4-5;
  6. 现在我遇到的困难是,如何证明这种贪心算法是最优的?我猜这个证据必须看起来像这里的那些:http://www.cs.princeton.edu/~wayne/kleinberg-tardos/pdf/04GreedyAlgorithmsI-2x2.pdf

1 个答案:

答案 0 :(得分:2)

问题是:

  • 是否存在选择最大长度立方体不是最佳的情况?

在每个决策节点,我们必须决定选择 a b ,给定 a> b

假设选择b是严格最优的(暗示最大高度)

  • 案例1: col(a) == col(b)
  • b optimal => final tower: b, x0, x1, ...
  • 但也适用于身高相同的建筑:a, x0, x1, ...
  • 有效,因为:col(a) == col(b)(a > b) & (b > x0) => (a > x0)(及物性)
  • 矛盾!

  • 案例2 col(a) != col(b)

  • b optimal -> final tower: b, x0, x1, ...
  • 但也有效建筑,身高更高:a, b, x0, x1, ...
  • 有效,因为:(a > b) & (col(a) != col(b)) => a before b
  • 矛盾!

我们假设采摘b是严格优化的并且表现出矛盾。挑选b只能与选择a(剩余的最大长度立方体)同样好或更差。