改良蛋滴拼图

时间:2017-04-22 14:45:49

标签: algorithm dynamic-programming

假设我有 m 鸡蛋,并希望知道 n -floor(n> = 2)建筑物中的哪些楼层可以安全地丢弃鸡蛋,以及会导致鸡蛋在着陆时破裂。

几乎没有假设:

  1. 幸存的鸡蛋停留在一楼,可以再次使用。我必须到一楼去收集幸存的鸡蛋。
  2. 破蛋不能再使用了。
  3. 所有鸡蛋的跌倒效果都相同。
  4. 如果鸡蛋在掉落时断裂,那么如果从较高的窗口掉落则会破裂。
  5. 如果一个鸡蛋在跌倒时幸存下来,那么它会在较短的跌幅中存活下来。
  6. 从最高层落下时鸡蛋会断裂,从一楼掉落时鸡蛋不会断裂。
  7. 我很难上楼梯,而且容易下楼。

    如何最大限度地减少在较高楼层旅行的距离?

1 个答案:

答案 0 :(得分:0)

我在Haskell上找到了一般行进距离here的解决方案,然后在Python上重写了它并为我的任务进行了修改。

from math import inf
from collections import namedtuple
from functools import lru_cache

Solution = namedtuple('Solution', ('moves', 'floors'))


@lru_cache(maxsize=None)
def solve(held, dropped, height, lo, hi):
    if hi == lo + 1:
        return Solution(0, [])
    solutions = list()
    if dropped:
        moves, floors = solve(held + dropped, 0, 1, lo, hi)
        solutions.append(Solution(moves, [1] + floors))
    if held:
        for _height in range(lo + 1, hi):
            breaks = solve(held - 1, dropped, _height, lo, _height)
            survives = solve(held - 1, dropped + 1, _height, _height, hi)
            worst = max((breaks, survives), key=lambda x: x.moves)
            solutions.append(
                Solution(
                    max(_height - height, 0) + worst.moves,
                    [_height] + worst.floors
                )
            )
    return min(solutions, key=lambda x: x.moves, default=Solution(inf, []))


print(solve(3, 0, 1, 1, 100))