【问题标题】:Minimal elevator problem in a building with n floors and k lifts [closed]n 层和 k 电梯的建筑物中的最小电梯问题[关闭]
【发布时间】:2020-11-17 21:47:09
【问题描述】:

所以问题是:

“给定具有 k 部电梯的建筑物的 n 层数,其中每部电梯 Li 从 ai 层到 bi 层,(ai 和 bi 已给出)找出从一楼到n-th 楼的最少电梯数量。”

这个问题必须使用动态规划来解决。唯一的问题是我不知道如何开始。 那么有没有人有任何类型的想法如何开始这个。

【问题讨论】:

  • 缺少什么吗?所陈述的问题似乎没有意义。具体来说,“李从a(I)层到b(i)层的每一部电梯”这句话令人费解。给出的唯一输入是 nk,那么 a(i) 和 b(i) 应该是什么?
  • 我的教授想说的是,对于每部电梯,你都有一个起点和一个目的地,例如,1 号电梯从 2 楼到 5 楼,2 号楼从 1 楼到 6. 楼层等
  • 目前我们学到的唯一技术是子问题重叠。
  • 老实说,这个问题对我来说仍然没有任何意义。您能否提供一个简单的示例输入和正确的解决方案?
  • 我没有例子,那是最糟糕的,一直试图解决这个问题大约 4 个小时

标签: algorithm dynamic-programming


【解决方案1】:

这个问题和Jumping-Game problem很相似;除了我们需要根据(ai, bi) values 自己创建输入数组。

让我们先这样做(为 Jump-game 问题创建输入数组):

N = 10 ## num of total floors
V = [(1, 5), (2, 8), (4, 10), (9, 10)]

nums = [0 for _ in range(N)] ## array we need to fill up to transform this problem to Jump-Game problem

## nums[i] represents the maximum number of floors it can go from floor-i (starting from floor 0 to floor N-1)

for ab_pair in V:
  a, b = ab_pair
  floor_diff = max(b-a, 0)
  if a >= N or a < 0:
    continue
  nums[a-1] = max(nums[a-1], floor_diff)

现在,我们只需要用上面的input-array: nums解决Jump-game问题。

也就是说,找到到达顶层所需的最少跳跃次数:

    def jump(self, nums: List[int]) -> int:
        if len(nums) <= 1:
            return 0
        
        numsteps = 0
        nc = -1
        tc = -1
        for i in range(len(nums)-1):
            if i >= nc:
                numsteps += 1
                nc = max(tc, i+nums[i])
            else:
                tc = max(tc, i+nums[i])
            if nc >= len(nums)-1:
                return numsteps
        
        return -1

输出:

## For [(1, 5), (2, 8), (4, 10), (9, 10)]

2

【讨论】:

  • @TarikPašić 我认为您需要在问题中添加更多细节,以便其他人能够更好地理解。也许您可以添加一个完整的示例并提交修改。
猜你喜欢
  • 2010-11-29
  • 2012-07-05
  • 2012-01-13
  • 1970-01-01
  • 2015-12-24
  • 2012-09-04
  • 1970-01-01
  • 1970-01-01
  • 2011-04-03
相关资源
最近更新 更多