Richard_

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

题目来源牛客网 https://www.nowcoder.com/practice/1177e9bd1b5e4e00bd39ca4ea9e4e216?tpId=90&&tqId=30903&rp=9&ru=/activity/oj&qru=/ta/2018test/question-ranking

题目描述

小招喵喜欢在数轴上跑来跑去,假设它现在站在点n处,它只会3种走法,分别是:
1.数轴上向前走一步,即n=n+1 
2.数轴上向后走一步,即n=n-1 
3.数轴上使劲跳跃到当前点的两倍,即n=2*n
现在小招喵在原点,即n=0,它想去点x处,快帮小招喵算算最快的走法需要多少步?

代码思路(借鉴于牛客网友 https://www.nowcoder.com/questionTerminal/1177e9bd1b5e4e00bd39ca4ea9e4e216):动态规划,想清楚target能从那些之前的点到达,找到之间的关系。

 1 import java.util.Scanner;
 2 
 3 
 4 public class Main {
 5 
 6     
 7     public static void main(String[] args) {
 8         Scanner sc = new Scanner(System.in);
 9         int target = Math.abs(sc.nextInt());
10         if(target <= 2) {
11             System.out.println(target);
12             return;
13         }
14         int[] dp = new int[target+1];
15         dp[0] = 0;
16         dp[1] = 1;
17         for(int i=2; i<=target; i++) {
18             if(i%2==0) {
19                 //对于目的地是偶数坐标的情况,一定是翻倍跳肯定效率不低于从i-1走过来
20                 dp[i] = 1 +  dp[i/2];
21             }else {
22                 //如果是奇数,有可能先到达i-1然后再走一步到达;或者先跳到i+1再退一步到达;
23                 dp[i] = 1 + Math.min(dp[i-1], 1+dp[(i+1)/2]);
24             }
25         }
26         
27         System.out.println(dp[target]);
28         
29     
30     }
31     
32 
33 }

 

posted on 2019-02-18 17:58  Richard_  阅读(401)  评论(0编辑  收藏  举报