动态编程问题总是可以表示为DAG

时间:2016-06-06 15:20:12

标签: dynamic-programming

我正在尝试绘制DAG以获得最长的子序列{3,2,6,4,5,1},但不能将其划分为DAG结构。

是否可以在树状结构中表示?

4 个答案:

答案 0 :(得分:3)

据我所知,标题中实际问题的答案是,"不,并非所有DP程序都可以缩减为DAG。"

将DP降级为DAG是我最喜欢的技巧之一,当它工作时,它通常会让我对问题有重要的见解,因此我发现它总是值得尝试。但我遇到了一些似乎至少需要超图的问题,this paper和相关的研究似乎证实了这一点。

对于the CS Stack Exchange,这可能是一个合适的问题,这意味着关于图减少的抽象问题,而不是关于最长增长子序列的具体问题。

答案 1 :(得分:1)

假设遵循序列,S = {3,2,6,4,5,1,7,8}并且R =根节点。您的树或DAG看起来像

              R
      3    2     4    1
           6     5    7
                      8

结果是树中最长的路径(从根到最大深度的节点)(结果= {r,1,7,8})。

上面的结果显示了S中增长最长的序列 .S中最长的子序列的树看起来如下

              R
   3   2   6   4   5   1   7   8
   6   4   7   5   7   7   8  
   7   5   8   7   8   8      
   8   7       8   
       8

结果再次是树中最长的路径(从根到最大深度的节点)(结果= {r,2,4,5,7,8})。

答案 2 :(得分:0)

是的,可以将最长的DP增加问题表示为DAG。 enter image description here

解决方案是找到从每个节点到该特定节点可能的最后一个节点的最长路径(包含最大节点的路径)。

这里,S是起始节点,E是结束节点,C是S和E之间的节点数 S E C
3 5 3
2 5 3
6 6 1
4 5 2
5 5 1
1 1 1

所以答案是3,因为我们只需遍历节点就很容易生成解决方案。 我想这可能会对你有所帮助。 参考:https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-006-introduction-to-algorithms-fall-2011/lecture-videos/lecture-20-dynamic-programming-ii-text-justification-blackjack/

答案 3 :(得分:0)

该问题的答案应为

我想从这里引用以下内容:The Soul of Dynamic Programming Formulations and Implementations

DP必须具有相应的DAG(大多数情况下是隐式的),否则我们将找不到有效的计算顺序。

对于您的情况,最长递增子序列可以表示为某些DAG,如下所示:

enter image description here

任务等于在该DAG中找到最长的路径。有关更多信息,请参阅Algorithms, Dynamic programming的6.2节。