【问题标题】:what is the need to use Dynamic programming approach for egg dropping puzzle?什么需要使用动态编程方法来解决鸡蛋掉落难题?
【发布时间】:2016-01-01 09:49:16
【问题描述】:

我在解决 DP 相关问题时遇到了泛化的egg dropping puzzle。 我可以使用不重复子问题的分而治之来解决这个问题。所以我相信不需要DP来解决掉蛋难题。 谁能判断以下算法在不需要 DP 的情况下是否有效

n- eggs
k-floors
initial call : eggDroppingPuzzle(n,k)
eggDroppingPuzzle(eggs, floor)
{
 if floor==1 return 1;
 else if eggs=1 return K;
 return 1+eggDroppingPuzzle(n-1,k/2-1);// problem is reduced by (size/2)-1
}

由于每个递归调用中没有重叠的子问题,我觉得不需要动态编程。

谁能解释我不需要 DP 的算法是否正确。如果它不正确,请解释我使用 DP 的正确算法。

【问题讨论】:

    标签: algorithm dynamic-programming puzzle


    【解决方案1】:

    您的代码断言(不包括边缘情况)

    eggDroppingPuzzle(eggs, floor) = 1+eggDroppingPuzzle(n-1,k/2-1)
    

    这意味着:

    • 您假设每一滴鸡蛋都会破裂(因为剩余 n-1 个鸡蛋),并且
    • 您的策略是始终从剩余楼层的中间不断下降(因为剩余的 k/2 -1 楼层)

    这两个假设通常都是错误的,因为其目的是尽量减少掉落次数。例如,根据您的策略,

    eggDroppingPuzzle(2, 100) = 1 + eggDroppingPuzzle(1, 49)

    而且由于 eggDroppingPuzzle(1, 49) = 49,这意味着,对于你 eggDroppingPuzzle(2, 100) = 50,这远远大于正确答案 14。这是因为你的策略不是最优的,因为这些错误假设。

    递归策略不做这样的假设。它简单地说明了显而易见的: eggDrop(n, k) = 1 + min{max(eggDrop(n - 1, x - 1), eggDrop(n, k - x)): 其中 x 在 {1, 2, ..., k}}

    显然,动态编程只是递归逻辑的自下而上的方法,您可以用时间(重复计算)换取空间(存储数组)。 是的,DP 方法是一种优化的蛮力方法。没有聪明的策略。只是探索所有状态直到解决状态。

    【讨论】:

      【解决方案2】:

      可能有一个封闭的形式可以实现最佳的产蛋效果,但事实并非如此。有两个鸡蛋,你会从半路掉下第一个,如果它破裂,你会非常抱歉,因为你必须让k/2 与第二个一起下降。一个更好的(但不是最优的!)双蛋策略是在第一个蛋同时上升√k 楼层最多k/√k = √k 下降,使第二个蛋最多下降√k。一般来说,动态程序在平均划分搜索空间的价值与打破鸡蛋的成本之间进行了最佳权衡。

      【讨论】:

      • 我不明白你什么时候说“更好但不是最佳”。无论如何。您可以检查提供的链接中的算法和问题中的算法,如果我犯了任何错误,请向我解释。
      • @stallion 您的代码所暗示的双蛋算法使 Theta(k) 在最坏的情况下下降。我画的那个是 Theta(√k),但是大 O 常数还有改进的余地。
      猜你喜欢
      • 2017-02-28
      • 2017-09-19
      • 1970-01-01
      • 1970-01-01
      • 2011-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-25
      相关资源
      最近更新 更多