1. 程式人生 > >【動態規劃問題】編程題

【動態規劃問題】編程題

clas nal spa 規劃 title can ice https rmi

題目來源牛客網 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 }

【動態規劃問題】編程題