Python程序:计算到达终点所需的步数


假设我们有一辆汽车,正在一维道路上行驶。目前我们的位置为0,速度为1。我们可以执行以下两种操作之一。

  • 加速:位置 := 位置 + 速度;速度 := 速度 * 2 倒车:如果速度 > 0,则速度 := -1;否则速度 := 1。

我们需要找到至少到达目标所需的操作次数。

因此,如果输入目标值为10,则输出为7。

为了解决这个问题,我们将遵循以下步骤:

  • 定义一个函数dfs()。它将接收数字、成本、正数、负数和目标值。

    • 总成本 := 成本 + max(2 * (正数 - 1), 2 * (负数 - 1))

    • 如果总成本 >= 最小步数,则

      • 返回

    • 如果目标值为0,则

      • 最小步数 := min(最小步数, 总成本)

      • 返回

    • 步长 := (2^数字) - 1

    • 如果步长 * 2 < |目标值|,则

      • 返回

    • dfs(数字 - 1, 成本, 正数, 负数, 目标值)

    • dfs(数字 - 1, 成本 + 数字, 正数 + 1, 负数, 目标值 - 步长)

    • dfs(数字 - 1, 成本 + 数字 * 2, 正数 + 2, 负数, 目标值 - 步长 * 2)

    • dfs(数字 - 1, 成本 + 数字, 正数, 负数 + 1, 目标值 + 步长)

    • dfs(数字 - 1, 成本 + 数字 * 2, 正数, 负数 + 2, 目标值 + 步长 * 2)

  • 在主函数中,执行以下操作:

  • 最小步数 := 无穷大

  • hi := 1

  • 当 2^hi < 目标值 时,

    • hi := hi + 1

  • dfs(hi, 0, 0, 0, 目标值)

  • 返回最小步数

让我们来看下面的实现,以便更好地理解:

示例

在线演示

class Solution:
   def solve(self, target):
      self.ans = int(1e9)
      hi = 1
      while (1 << hi) < target:
         hi += 1
      self.dfs(hi, 0, 0, 0, target)
      return self.ans
   def dfs(self, digit, cost, pos, neg, target):
      tot = cost + max(2 * (pos − 1), 2 * neg − 1)
      if tot >= self.ans:
         return
      if target == 0:
         self.ans = min(self.ans, tot)
         return
      step = (1 << digit) − 1
      if step * 2 < abs(target):
         return
      self.dfs(digit − 1, cost, pos, neg, target)
      self.dfs(digit − 1, cost + digit, pos + 1, neg, target − step)
      self.dfs(digit − 1, cost + digit * 2, pos + 2, neg, target − step * 2)
      self.dfs(digit − 1, cost + digit, pos, neg + 1, target + step)
      self.dfs(digit − 1, cost + digit * 2, pos, neg + 2, target + step * 2)
ob = Solution()
print(ob.solve(10))

输入

10

输出

7

更新于:2020-12-26

161 次查看

开启您的职业生涯

完成课程获得认证

开始学习
广告