当青训营遇上码上掘金
主题 3:寻友之旅 先贴上一段主题介绍
小青要找小码去玩,他们的家在一条直线上,当前小青在地点 N ,小码在地点 K (0≤N , K≤100 000),并且小码在自己家原地不动等待小青。小青有两种交通方式可选:步行和公交。
步行:小青可以在一分钟内从任意节点 X 移动到节点 X-1 或 X+1
公交:小青可以在一分钟内从任意节点 X 移动到节点 2×X (公交不可以向后走) 请帮助小青通知小码,小青最快到达时间是多久?
输入: 两个整数 N 和 K
输出: 小青到小码家所需的最短时间(以分钟为单位)
动态规划
一般这种有多种方式(物品)来求最短(最少、最多)单位量的题目,如果没有明显的数学解法,那么都可以考虑采用动态规划问题来求解,主题3比较符合,是属于一维的动态规划题目。
1.定义dp数组
dp数组的定义决定了后面的推导和初始化,是动态规划题目中的重中之重,不能想当然的定义,通常来说,dp数组是用来记录结果(最短时间)或者记录可以推导出最短时间的方式(路径啥的)。在主题3中的dp数组最合适的定义为 dp[i]表示从n到i的最短时间。
2.推导表达式
推导的表达式是为了能够利用已知的或者数学计算得到的量,来获得完整的dp数组。在主题三中,有两种方式到达目的地,显然我们希望选择更快的,那么dp[i]和dp[i-1]以及i为偶数时候dp[i/2]相关,我们可以从中选择较小的作为我们的结果,代码为
if j%2 == 0{
dp[j] = min(dp[j-1]+1, dp[j/2]+1)
} else{
dp[j] = dp[j-1]+1
}
3.初始化
初始化是我们题目中给的信息,结合一定的数学推导就可以获得的,在这个主题中有两点,一个是公交车不能回头开,所以小于n的位置都只能走路,另一个是n+1的位置为1。有这两点就可以将小于等于n+1的位置都完成初始化。在初始化搞完之后,可以看一下能不能返回结果,这个题目中,如k<=n+1那么就可以返回结果了。
4. 得到结果
这里基本上就是将上面的几步串起来得到结果,完成必要的input和output
反思
这个题目并不困难,思路也比较好想,但是在一些细节上,容易绕晕,比如dp数组长度上选择n还是k还是k+1等等。