Algorithm 给定C情况和D允许下降的最大楼层数

Algorithm 给定C情况和D允许下降的最大楼层数,algorithm,dynamic-programming,Algorithm,Dynamic Programming,这个问题来自“节目采访的要素”,已经困扰了我好几天了 问题是,“给定c情况和D允许下降,在最坏情况下,您可以测试的最大楼层数是多少?” 假设如下: 1) 所有案例都具有相同的属性,如果其中一个案例从某个级别中断,那么所有其他案例也会中断 2) 坠落后仍能存活的箱子可以再次使用,但破损的箱子将被丢弃 3) 如果一个箱子掉下来就碎了,那么它从更高的地板上掉下来就碎了。如果它能幸存下来,它就能在较短的时间内幸存下来 对我来说,这个问题似乎是“广义两蛋问题”的一个变体,在这个问题中,你试图最小化滴数该问

这个问题来自“节目采访的要素”,已经困扰了我好几天了

问题是,“给定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)空间解决同样的问题。实现上述递推关系自然会导致使用2D记忆矩阵的动态规划。您将如何使用1D阵列实现这一点

您将如何使用1D阵列实现这一点

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

我的困惑是——当案件破裂时,是什么原因造成的

在x层测试一个案例:

  • 如果案例存活下来,那么您知道案例永远不会在地板上破裂[1,x+1](公式中对应的
    1+F(c+1,d-1)
  • 如果箱子破裂,那么你知道箱子总是在地板[1,x]上破裂。(公式中对应的
    F(c,d-1)

  • 你少了一个案例,所以它减少到先前计算的F值。非常感谢你的回答。你用来最小化空间的技术-你是怎么想到的?这种技术有一个通用名称吗?@JennaKwon基本思想是,对于计算
    F(x,y)
    ,与
    F(x-2,…)
    F(x-3,…)
    ,我们可以重用空间,而不存储
    F(x-2,…)
    F(x-3,…)
    …@JennaKwon我不知道这项技术的英文名称,但在中文中,我们称之为“滚动数组". 在几次谷歌搜索之后,我发现了一种类似的技术,英文名为“滑动窗口”。你可以阅读进一步的信息。
    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