题目来源牛客网 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 }