【问题标题】:Hill climbing problem requiring Dynamic programming需要动态规划的爬山问题
【发布时间】:2020-10-31 04:10:05
【问题描述】:

所以,基本上问题在于有一系列山点。我们只能从一个山点移动到下一个更大的山点。

请看下图了解一下。

上图黑点是山顶,每个山顶都有一些香料,有一定的味道价值。我们可以从一个山顶移动到另一个山顶品尝其中的香料。

请参阅下图以了解有效动作。 green lines gives valid movements

所以,现在我们将得到一个包含 2 个整数 b,c 的查询,对于每个查询,我们需要确定从 b 山点移动到 c 是否可行。如果是,那么我们必须输出旅程的总味道。

假设有一个查询,其中 b = 1 , c = 10。

所以我们需要找到从1号山到10号山的移动是否可行,如果是,我们必须输出旅程的美味。

如果查询量非常少,问题就很简单了,因为对于每个查询,我们可以在循环中迭代,看看是否可以从 1 到 10,如果可以,那么我们将总结味道。

对于这个特殊问题,我们的路径将是 1-->2-->6-->7-->9-->10。

但是如果查询结果是 b = 1 , c = 11。

所以我们不能从 1 到 11,因此没有路径是可能的,答案是 -1。

但是当有非常大的查询时,我们可以为每个查询循环迭代。我的意思是我们必须对数据进行预处理,以便在每个查询中我们只需在恒定时间内计算结果。

我特别想知道什么?

How can i know if reaching from b to c is possible or not in constant time.

If path is possible than how to calculate the sum of path in constant time.

【问题讨论】:

  • 一系列山点以什么形式出现?对象数组? (能不能举个例子)
  • 例如,它们将在数组中给出。 h[] = {10, 7, 5, 6, 4, 3, 8, 9},其中 hi 是山点的高度。

标签: arrays algorithm optimization


【解决方案1】:

您可以使用 O(n) 空间和 O(n+q) 时间解决此问题,其中 q 是使用最低公共祖先算法的查询数。这是解释算法的topcoder algorithm tutorial

要将问题转换为这种形式,请为每个小山定义一个节点,并让节点的父节点是我们可以从这一点移动到的小山。引入一个额外的根节点,它是任何没有有效移动的山丘的父节点。

然后要确定是否存在从 b 到 c 的路径,您只需检查 LCA(b,c) 是否等于 c。

您还可以在 O(n) 中预先计算从每个节点开始到根节点结束的路径上的香料总和。要计算沿路径的总和,只需从从 b 开始的总和中减去从 c 开始的总和即可。

一开始构造图似乎有点困难,但这也可以使用 next greater element algorithm 在 O(n) 中完成。

【讨论】:

  • 非常感谢,真的很有帮助
【解决方案2】:

是的,您可以在O(nlogn) Time 内解决这个问题。

算法

  • 首先为每个小山找到下一个更大的小山(如果存在)。您可以使用堆栈在O(n) 中执行此操作。
  • 现在创建一棵树,其中包含您在步骤 1 中找到的下一个更大的山丘,并检查 a 是否有从 a 到 b 的路径,您可以使用带二元提升的最低共同祖先在 O(logn) 或稀疏表中回答在O(1) 时间回答。如果 LCA(a,b) = c 存在从 a 到 b 的路径。
  • 要计算路径总和,您需要将总和存储在从根节点开始的树节点的每个高度。这也可以使用 DFS 或 BFS 在O(n) 中完成。
  • 最后你的整个程序将在O(nlogn) even in worst case 中运行

【讨论】:

  • 谢谢我已经完成了这个问题,但我很感激你的努力。
猜你喜欢
  • 2011-10-17
  • 2012-04-09
  • 2020-01-10
  • 2021-01-23
  • 1970-01-01
  • 2011-10-14
  • 1970-01-01
相关资源
最近更新 更多