给定C案例和D允许丢弃量可以测试的最大楼层数

时间:2016-05-26 18:57:09

标签: algorithm dynamic-programming

这个问题来自"编程访谈的元素"并且困惑了我几天。

问题是,"给定c个案例和D个允许的丢弃量,在最坏的情况下你可以测试的最大楼层数是多少?#34;?

假设如下:

1)所有案例都具有相同的属性,如果一个案例从一个级别中断,那么所有其他案例

2)可以再次使用幸存下降的情况,但丢弃一个丢弃的情况

3)如果案件在掉落时破裂,那么如果从较高楼层掉落则会破裂。如果它存活下来,它会在较短的下降后存活下来。

对我来说,这个问题似乎是一个广义的两个鸡蛋问题的变种"你试图减少滴数的地方。 此问题的目的是在给定确定数量的下降量的情况下最大化楼层数。

解决方案中给出的递归关系如下:

F(c + 1,d)= F(c,d - 1)+ 1 + F(c + 1,d - 1)

在F(c,d)= max#floors的情况下,我们可以测试w / c情况和d drop。 这种复发关系令我感到困惑,尽管本书的解释是右边的术语是我们进行的楼层,以防万一在F楼(c,d - 1)处测试时没有破坏我的困惑是 - 当案件破裂时会有什么原因?这不会出现在递归关系中。

这个问题也带来了额外的问题 - 用O(c)空间解决同样的问题。实现上述递归关系自然会使用2D存储矩阵进行动态编程。你会如何使用一维阵列做到这一点?

1 个答案:

答案 0 :(得分:1)

  

你如何使用一维阵列做到这一点?

1.将你的函数写入:F(c,d)= F(c - 1,d - 1)+ 1 + F(c,d - 1)

2.编写代码:

for (i=1; i<=D; i++)
for (j=C; j>=0; j--)
  a[j] = a[j-1] + a[j] + 1

说明:

a[j](after assignment, a[j] equals F(c, d)) 
   = a[j-1](F(c-1, d-1)) + a[j](F(c, d-1)) + 1
  

我的困惑是 - 当案件破裂时会有什么原因?

在x楼测试一个案例:

  1. 如果案件存活,那么你就知道案件永远不会破解[1,x + 1](公式中相应的1 + F(c + 1, d - 1))。
  2. 如果案件中断,那么你知道案件总是在地板上打破[1,x]。(公式中相应的F(c, d - 1)