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

How to prove this greedy algorithm as optimal?

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

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

1) 颜色相同的立方体无法叠加;

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

例如:立方体c1的长度为3,立方体c2的长度为5。立方体c1可以放在c2的上面,但是立方体c2不能放在c1的上面。

好吧,为了解决这个问题,我想出的算法是这样的:

  1. 我们按边长降序对立方体进行排序,然后将它们放入数组中;
  2. 我们将数组中的第一个立方体添加到塔中;
  3. 我们将最后插入的立方体的长度(在本例中为第一个立方体的长度)保存在变量 l 中;
  4. 我们将最后插入的立方体的颜色(在本例中为第一个立方体的颜色)保存在变量 c 中;
  5. 我们遍历数组的其余部分,插入第一个长度小于 l 且颜色不同于 c 的立方体,然后重复 3-4-5;

现在我遇到的困难是,如何证明这种贪心算法是最优算法?我想证明必须以某种方式看起来像这里的证明:http://www.cs.princeton.edu/~wayne/kleinberg-tardos/pdf/04GreedyAlgorithmsI-2x2.pdf

问题是:

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

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

假设选择 b 是严格最优的(意味着最大高度):

  • 案例一: col(a) == col(b)
  • b optimal => final tower: b, x0, x1, ...
  • 但通过等高构造也有效:a, x0, x1, ...
  • 有效,因为:col(a) == col(b)(a > b) & (b > x0) => (a > x0)(传递性)
  • 矛盾!

  • 案例二 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一样好或差(剩下的最大长度的立方体)。