当青训营遇上码上掘金
寻友之旅
- 小青要找小码去玩,他们的家在一条直线上,当前小青在地点 N ,小码在地点 K (0≤N , K≤100000),并且小码在自己家原地不动等待小青。小青有两种交通方式可选:步行和公交。
步行:小青可以在一分钟内从任意节点 X 移动到节点 X-1 或 X+1
公交:小青可以在一分钟内从任意节点 X 移动到节点 2×X (公交不可以向后走)
请帮助小青通知小码,小青最快到达时间是多久?
1. 情况分析
由于需要时间最短,因此我们最好乘坐公交车,减少步行的时间;
if K < N,小青只能步行;else,小青可以乘坐公交,再用步行弥补剩下距离,可以采用倒推的思想。
2. 动态规划
动态规划常常适用于有重叠子问题和最优子结构性质的问题,而本题中可把整个出行当成一个最优化的选择,其中子结构则包含着N为奇数和偶数,出行方式有两种不同,且在此之间的出行时间应也为最优,此为子结构。
与情况1类似,最简单的情况即只能步行,if K < N, count = N - K, 不能乘坐公交车。
当 N < K,定义Ni为其中一时间的位置,dp[Ni]为走到此位置时的最优用时:
- 当 Ni为偶数,前一段可以是乘坐公交车,也可以是步行,则 dp[Ni] = min(dp[Ni-1]+1, dp[Ni/2]+1)
- 当 Ni为奇数,前一段不可能是乘坐公交车,dp[Ni] = dp[i-1] + 1
3. 综合分析
1中的解法则是进行人工分析与判断,我们应该尽可能的多坐公交车,所以简化了Ni为偶数的计算方式