当青训营遇上码上掘金
题目 小青要找小码去玩,他们的家在一条直线上,当前小青在地点 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 :
- 当 Ni 为偶数时, dp[Ni] = min (dp[ Ni-1 ] + 1, dp[ Ni/2 ]+1)
- 当 Ni 为奇数时, dp[Ni] = dp[ i-1 ] + 1