最长增加子序列如何成为DAG中最长路径的特例?

时间:2012-10-16 03:26:29

标签: algorithm graph directed-acyclic-graphs

我在“Hitchhiker的算法指南”中读到了这句话。但是,我无法将其可视化为LIS问题,我们所拥有的只是一系列数字。如何将其调整为图形问题?

2 个答案:

答案 0 :(得分:5)

想象一下2D网格的问题。你在左下方的广场,你需要到达右上方。你能想象出这个计划中的非循环DAG吗?

现在想象一些广场是被禁止的。禁止使用正方形可能导致“锁定”(您可能会发现自己陷入困境),现在选择跟随哪些路径实际上非常重要。 就图形而言,您可以将禁止正方形视为删除顶点,并且您的目标是从根到达一个特定节点(接收器)

现在让我们回到LIS。在解决LIS时,您实际需要做的是决定您选择哪些数字,哪些不是。限制是每当你选择一个号码时,你就不能选择小于的任何数字(你按顺序选择数字)。

现在我们可以混合两种东西。想象一下,你将从你的数字序列中构建一个图形:

  • 每个号码都是一个节点。
  • 数字节点A具有数字节点B iff的边缘
    • B来自序列中的A
    • B的值大于A
  • 有一个特殊节点结束
  • 每个节点都有结束
  • 的边缘

此图表上的每个路径都是有效的增加子序列。找到LIS的问题现在是在此图上找到最长路径的问题。

答案 1 :(得分:2)

如果我们有一组数字,比如说1,5,4,8。我们可以构建如下的DAG。

  • 将每个数字添加为顶点。
  • 对于每个数字顶点,将权重1的传出边添加到其后的所有更大数字。
  • 将具有权重0的传出边的节点S添加到所有数字顶点。
  • 添加一个节点E,其中包含来自所有数字顶点的权重为0的传入边。

因此,最长增加子序列问题变成了从S到E问题的最长路径。

LIC and DAG