Algorithm 改良掉蛋拼图

Algorithm 改良掉蛋拼图,algorithm,dynamic-programming,Algorithm,Dynamic Programming,假设我有m个鸡蛋,希望知道n层(n>=2)建筑中的哪些楼层可以安全地掉下鸡蛋,哪些楼层会导致鸡蛋在落地时破裂 有几个假设: 一个鸡蛋在摔下来后仍然留在一楼,可以再次使用。我得到一楼去收集活蛋 破鸡蛋不能再用了 跌落对所有鸡蛋的影响是相同的 如果鸡蛋掉下来会碎,那么从较高的窗户掉下来就会碎 如果一只蛋能在一次坠落中存活下来,那么它能在一次较短的坠落中存活下来 鸡蛋从最高层掉下来会碎,从第一层掉下来不会碎 对我来说,上楼梯很难,下楼梯也很容易 如何使在更高楼层上旅行的距离最小化?我在Haskell上

假设我有m个鸡蛋,希望知道n层(n>=2)建筑中的哪些楼层可以安全地掉下鸡蛋,哪些楼层会导致鸡蛋在落地时破裂

有几个假设:

  • 一个鸡蛋在摔下来后仍然留在一楼,可以再次使用。我得到一楼去收集活蛋
  • 破鸡蛋不能再用了
  • 跌落对所有鸡蛋的影响是相同的
  • 如果鸡蛋掉下来会碎,那么从较高的窗户掉下来就会碎
  • 如果一只蛋能在一次坠落中存活下来,那么它能在一次较短的坠落中存活下来
  • 鸡蛋从最高层掉下来会碎,从第一层掉下来不会碎
  • 对我来说,上楼梯很难,下楼梯也很容易


    如何使在更高楼层上旅行的距离最小化?

    我在Haskell上找到了一般旅行距离的解决方案,然后在Python上重新编写,并针对我的任务进行了修改

    从数学导入inf
    从集合导入namedtuple
    从functools导入lru\U缓存
    Solution=namedtuple('Solution',('moves','floors'))
    @lru_缓存(最大大小=无)
    def解算(保持、下降、高度、低、高):
    如果hi==lo+1:
    返回解决方案(0,[])
    解决方案=列表()
    如果删除:
    移动,楼层=求解(保持+下降,0,1,低,高)
    附加(解决方案(移动[1]+楼层))
    如果举行:
    对于范围内的_高度(lo+1,hi):
    断开=解算(保持-1,下降,_高度,低,_高度)
    生存=解决(保持-1,下降+1,_高度,_高度,高)
    最差=最大值((断裂,幸存),关键点=λx:x.移动)
    解决方案.append(
    解决方案(
    最大(_height-height,0)+最差移动,
    [u高度]+最差楼层
    )
    )
    return min(解决方案,key=lambda x:x.moves,默认值=Solution(inf,[]))
    打印(求解(3,0,1,1100))
    
    最小化什么?最坏的情况,一般情况,其他情况?在最坏的情况下尽量缩短距离。你似乎可以通过以下方式来参数化问题:未破碎的鸡蛋数量,你持有的鸡蛋数量,你当前所在的楼层,你知道的最高楼层是安全的,而你知道的最低楼层是不安全的。然后使用DP,因为没有必要使用DP。这是纯数学。@user58697我想看看这个问题的纯数学解决方案。你在什么地方有书面记录吗?