【问题标题】:Dynamic programming - basic algorithm动态规划——基本算法
【发布时间】:2011-12-14 16:04:59
【问题描述】:

考虑以下问题:

我们有两个货物序列,可以包含谷物或牛。现在,我们还有一个货物装载序列,我们希望从初始序列中获取这些装载序列。

初始序列可能如下所示,我们想要实现的序列显示在右侧:

C   G                     
G   C                     
C   G                     G
C   C                     C
G   G                     G
 \ /
  ?

现在,在? 点,您可以挑选左侧货物或右侧货物。应该进行挑选以匹配所需的最终序列。

例如,我们应该在开头选择Grain,然后图片会变成这样:

    G                     
C   C                     
G   G                     G
С   C                     C
С   G                     G
 \ /
  ?  ---> G (we took it from the left)

那么,这个问题有一个众所周知的名字吗?我知道这可以通过一个简单的动态规划算法来解决,但我想知道更多。

基本上,如果关于这个问题还有更多要阅读的内容,我想阅读它。 例如,如果我们有无限数量的有限输入序列,我对算法的复杂性一无所知。

【问题讨论】:

  • 不错的问题,只是你的例子无法解决......
  • @solendil 我更新了问题,谢谢:)
  • 我想完整的解决方案必须包括识别不存在解决方案的输入......

标签: algorithm math dynamic-programming


【解决方案1】:

我没有太多的见解要分享,但这里是:

  • 我们将货物称为 0 和 1,而不是 C 和 G,此外,我们将两个队列标记为 0 和 1,而不是左右。

  • 首先,该算法无法用无限(流式)输入序列求解。如果两个输入序列在“流可见性窗口”之外只有 0 和 1,如果您的结果序列需要它,您就不能瞄准这个 1,所以当有答案时您可能会被卡住。

  • 既然我们不能谈论无穷大,那么让我们来分析一下求解器的复杂性。我看不出比您的算法更好的了...如果结果序列的长度为 m 并且我们将结果建模为 0 和 1 的序列(左右),则有 2^m 种可能的解决方案。如果我们考虑在每一步中,平均有一个机会只有一个输入序列有效,这意味着另一个序列以及其他后续序列将无效。这应该会导致 O(m!) 复杂度。

【讨论】:

    【解决方案2】:

    形式语言理论家会将您的问题描述为测试字符串 w 是否是两个字符串 u、v 的 shuffle。似乎已经有一些工作可以识别使用 shuffle 构建的语言的复杂性(例如,shuffle上下文无关语言和常规语言是上下文无关的)。

    【讨论】:

      猜你喜欢
      • 2012-03-26
      • 2013-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-28
      相关资源
      最近更新 更多