「青训营 X 码上掘金」寻友之旅

74 阅读1分钟

当青训营遇上码上掘金

题目 小青要找小码去玩,他们的家在一条直线上,当前小青在地点 N ,小码在地点 K (0≤N , K≤100 000),并且小码在自己家原地不动等待小青。小青有两种交通方式可选:步行和公交。 步行:小青可以在一分钟内从任意节点 X 移动到节点 X-1 或 X+1 公交:小青可以在一分钟内从任意节点 X 移动到节点 2×X (公交不可以向后走) 请帮助小青通知小码,小青最快到达时间是多久?输入: 两个整数 N 和 K 输出: 小青到小码家所需的最短时间(以分钟为单位)

初读这道题有点懵,这不简简单单几个分类讨论就解决了吗

  • 当N>K时,因为公交不逆行小青只能步行,直接得到time = N - K
  • 当N<K时,小青可以视情况选择坐公交,分类讨论不同的情况,比较判断得出结果

写出来发现这代码太丑了,质量低可读性差。稍微从数学角度+贪心思想改进升级一下: 由于公交车可以在一分钟内从任意节点 X 移动到节点 2X,所以每次坐公交的目的地都应该是偶数点,将整个过程倒过来分析,如果目的地是偶数则必然是要坐公交到达才能保证所用时间最短,反之只能步行一站让目的地成为偶数点 最后索性再次升级,将此问题化为动态规划:

动态规划(dynamic programming)是通过组合子问题的解而解决整个问题的。类似于分治策略。他是运筹学的一个分支,是一种在数学和计算机科学中使用的,用于求解包含重叠子问题的最优化问题的方法。 动态规划算法对每个子问题只求解一次,将其结果保存在一张表中,从而避免每次遇到各个子问题时重新计算答案。

当 K<N 不需要多做处理 对于 N<K :

  1. 当 Ni 为偶数时, dp[Ni] = min (dp[ Ni-1 ] + 1, dp[ Ni/2 ]+1)
  2. 当 Ni 为奇数时, dp[Ni] = dp[ i-1 ] + 1