【问题标题】:Dynamic Programming for test tube试管动态规划
【发布时间】:2019-01-14 01:23:18
【问题描述】:

Eli 是一个喜欢学习化学的少年。她最近加入了一家化学研究实验室。

博士。菲尔想让她玩弄一些化学物质并观察它们的反应。

因此,他给了她一排装有不同化学物质的试管托盘 并告诉她:

“将这些化学物质随意混合在一起,但你必须遵守两条规则:

  1. 切勿将两种化学品的管彼此相邻制成混合物。

  2. 继续向混合物中添加更多化学物质,直到它不违反新规则。”

例如,在图片中,您可以看到给了她 5 个试管,她可以在不违反规则的情况下制作 4 种不同的混合物:{1,3,5}、{2,4}、{2,5} , {1,4}。

但她不能混合 1 和 3 只是因为她仍然可以 在不违反规则的情况下添加5。

她很想知道有多少种不同的混合物 她可以在不违反规则的情况下做出任何 给定数量的管子。

这就是她问你的原因 写一段代码给她计算一下。

输入

输入将由一系列数字 N 组成,1 ≤ N ≤ 76。每个数字将位于 单独的线。

输入将被 0 终止。

输出

在不违反上述规则的情况下,输出她可以制作的不同混合物的数量 如示例中所示,在单行上方。所有子集的数量将小于 2^31

输入:

1 2 3 4 5 6 7 8

输出:

0 0 1 3 4 5 7 9

我是否可以使用 Mix[i] = Mix[i - 2] + Mix[i - 3] 之类的公式来找到答案,因为我注意到一个模式,所以我尝试使用这个公式,但是不能完全回答输入 4,5 和 6

【问题讨论】:

标签: algorithm dynamic-programming combinatorics discrete-mathematics


【解决方案1】:

你已经很接近答案了。让我们定义一个名为dp 的数组,其中dp[i] 是混合i 化学品的方式的数量始终包括混合物中的ith 化学品。要计算dp[i],我们有两种情况:

  1. 包括i - 2th 化学品,以及dp[i - 2] 可能的方式。
  2. 包括i - 3th 化学品,但不包括i - 2th 化学品,dp[i - 3] 可能的方式。

我们必须包括i - 2th 化学品或i - 3th 化学品,因为如果我们不包括其中之一,就有可能包括违反规则的i - 2th 化学品。

所以dp[i] = dp[i - 2] + dp[i - 3],它与您的公式相匹配。但是,这不是解决方案(还)。请记住,dp[i] 仅计算可能的混合物数量,包括ith 化学品。我们需要添加不包括ith 化学物质的可能混合物的数量,即dp[i - 1]。因此,我们的答案是dp[i] + dp[i - 1]

对于一些实现细节,我们必须硬编码dp[0]dp[1]dp[2] 作为我们的基本案例。此外,我们需要对输入 1 到 3 的输出进行硬编码,因为对于这些输入,可能存在由一种无效的单一化学物质组成的“混合物”。

【讨论】:

  • 所以表示dp[i]=dp[i]+dp[i-1]?
  • @MuhdIqbal dp[i] = dp[i - 2] + dp[i - 3],但这不是答案。 i 化学品的答案是 dp[i] + dp[i - 1]
  • 很抱歉,我还是不太明白,您能否展示一下获取输入 4、5、6 的输出的工作步骤,非常感谢您,如果您能做到,将不胜感激,不好意思,不了解
  • @MuhdIqbal dp 数组最终看起来像这样(从索引 0 开始):0 1 1 1 2 2 3 4 5 7 9 12... 4 的答案是 dp[4] + dp[3],即 2 + 1 = 3。 5 的答案是dp[5] + dp[4] = 2 + 2 = 4。 6 是dp[6] + dp[5] = 3 + 2 = 5。请记住,dp 数组不存储答案。 dp[i] 存储包含ith 化学品的混合物的数量。此外,该算法计算输入 1 到 3 的单一化学物质的混合物,这在问题中无效,因此您必须对输入 1 到 3 的输出进行硬编码。
  • @MuhdIqbal 如果我的回答解决了您的问题,请随时通过单击赞成和反对箭头下方的复选标记的轮廓来接受它。它对我有很大帮助,并将问题标记为已回答。不过,您不需要这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多