【動態規劃問題】編程題
阿新 • • 發佈:2019-02-18
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 }
【動態規劃問題】編程題