这个问题来自“节目采访的要素”,让我困惑了好几天。
问题是:“如果C案例和D允许下降,那么在最坏的情况下,你可以测试的最大楼层数是多少?”
假设如下:
1)所有案例都有相同的属性,如果其中一个案例偏离了某个级别,那么所有其他案例也都会
2)坠落后幸存的箱子可以再次使用,但破损的箱子被丢弃。
3)如果一个箱子在跌落时断裂,那么如果从较高的楼层跌落,它就会断裂。如果它能存活下来,它就能在较短的坠落中存活下来。
对我来说,这个问题看起来像是“广义两蛋问题”的一个变体,在这个问题中,你试图最小化滴数这个问题反而是为了最大限度地确定楼层的数量,考虑到一定数量的落差。
解中给出的递推关系如下:
f(c+1,d)=f(c,d-1)+1+f(c+1,d-1)
其中f(c,d)=最大楼层,我们可以测试W/C情况和D下降。
这种重复关系让我感到困惑,尽管书中解释说,右边的这个词是我们在F(C,D-1)+1层测试时,如果一个病例没有破裂的话,我们继续讨论的楼层。我的困惑是-什么解释了什么时候案子会破?这不会出现在重复关系中。
这个问题也提出了额外的问题-用O(C)空间解决同样的问题。实现上述递推关系,自然会转化为具有二维记忆矩阵的动态规划。你怎么用一维数组来做这个?
最佳答案
你怎么用一维数组来做这个?
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,x+1]上破裂(对应于公式中的
1 + F(c + 1, d - 1)
)。如果箱子破了,那么你知道箱子总是在地板上破了[1,x](对应于公式中的
F(c, d - 1)
)关于algorithm - 您可以测试给定C情况和D允许跌落的最大楼层数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37468981/