有什么需要使用动态编程方法来解决掉蛋问题?

时间:2015-10-04 18:15:18

标签: algorithm dynamic-programming puzzle

我正在解决与DP相关的问题,我遇到了广义的egg dropping puzzle。 我可以使用分而治之的方法解决这个问题,其中subProblems不会重复。所以我相信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的正确算法。

2 个答案:

答案 0 :(得分: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方法是一种蛮力的优化方式。没有涉及聪明的策略。只是探索所有州,直到解决方案状态。

答案 1 :(得分:0)

最佳鸡蛋可能会有一个封闭的形式,但事实并非如此。有了两个鸡蛋,你就要从中途放下第一个鸡蛋然后如果它破裂就非常抱歉,因为你必须用第二个产生k/2滴。一个更好(但不是最佳!)的两个鸡蛋策略是一次上升√k个楼层,第一个鸡蛋最多k/√k = √k滴,最多√k滴第二。一般来说,动态程序可以最优化地将搜索空间的分割值与破坏蛋的成本进行折衷。