这个问题来自"编程访谈的元素"并且困惑了我几天。
问题是,"给定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存储矩阵进行动态编程。你会如何使用一维阵列做到这一点?
答案 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 + F(c + 1, d - 1)
)。F(c, d - 1)
)