zoukankan      html  css  js  c++  java
  • 【动态规划问题】编程题

    题目来源牛客网 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 }
  • 相关阅读:
    【leetcode】1030. Matrix Cells in Distance Order
    【leetcode】1031. Maximum Sum of Two Non-Overlapping Subarrays
    【leetcode】1032. Stream of Characters
    L120 单词造句
    L119
    L118
    2018.8.6邮件规范一
    L117
    L116
    L115
  • 原文地址:https://www.cnblogs.com/singular/p/10397013.html
Copyright © 2011-2022 走看看