每日程式設計系列 跳石板

2022-08-01 07:42:10 字數 1385 閱讀 5226

一、題目:

小易來到了一條石板路前,每塊石板上從1挨著編號為:1、2、3.......

這條石板路要根據特殊的規則才能前進:對於小易當前所在的編號為k的 石板,小易單次只能往前跳k的乙個約數(不含1和k)步,即跳到k+x(x為k的乙個非1和本身的約數)的位置。 小易當前處在編號為n的石板,他想跳到編號恰好為m的石板去,小易想知道最少需要跳躍幾次可以到達。

例如:n = 4,m = 24:

4->6->8->12->18->24

於是小易最少需要跳躍5次,就可以從4號石板跳到24號石板 

輸入描述:

輸入為一行,有兩個整數n,m,以空格隔開。

(4 ≤ n ≤ 100000)

(n ≤ m ≤ 100000)

輸出描述:
輸出小易最少需要跳躍的步數,如果不能到達輸出-1
輸入例子:
4 24
輸出例子:
5

二、答案解析:

此題顯然是一道動態規劃的題目,動態規劃就是將問題劃分為若干個子問題,而若干個子問題間又擁有公共的子問題,並非獨立存在,問題的核心是狀態轉移公式,就是說下乙個問題的解決,依賴著上乙個問題的解,因此就此需要建立乙個鍊錶,將每個子問題的解存入,最後組合出最優解(最大或最小解),接下來詳細描述一下問題的解決過程:

1.首先建立乙個長度為m-n+1的整數陣列,包括了起點與終點;

2.陣列的元素表示從起點到達該點的最小跳躍次數,先將起點初始化為0,然後將其他元素初始化為int的最大值(乙個常數),用來表示不可達;

3.接下來要遍歷每一塊石板(即整個陣列):

(1)首先要判斷當前元素的值是否是int的最大值,如果是,則表示不可達,跳出當前迴圈,否則求解當前石板編號的因數列表,因為題目要求一次跳躍的步數只能是當前石板編號的因數;

(2)然後就是遍歷當前石板編號的因數列表,求出當前石板到達每乙個因數對應的下乙個石板的最小跳躍次數(在求解之前要判斷下乙個石板的編號是否小於等於m,不滿足條件則跳過當前迴圈),求最小跳躍次數時,要在對應下乙個石板元素的值和當前石板元素的值+1中取最小值

4.最後完成遍歷,判斷一下陣列尾元素的值是否為int的最大值,如果是表示不可達,返回-1,否則返回當前值,表示從指定起點到當前點的最小跳躍次數。

演算法如下:

跳石板(詳解)

題目分析 這道題就是計算從n開始加,最少加幾次等於m,前提條件是每次相加的數必須是當前數的約數 思路分析 將m個石板看做乙個儲存結果的陣列jumpnum,每個jumpnum i 中都儲存著從n到當前位置最小的步數,如果是0,則說明不能走到這個位置。從起點開始對jumpnum進行遍歷,先求當前位置的所...

牛客 程式設計題 跳石板

小易來到了一條石板路前,每塊石板上從1挨著編號為 1 2 3 這條石板路要根據特殊的規則才能前進 對於小易當前所在的編號為k的 石板,小易單次只能往前跳k的乙個約數 不含1和k 步,即跳到k x x為k的乙個非1和本身的約數 的位置。小易當前處在編號為n的石板,他想跳到編號恰好為m的石板去,小易想知...

跳石板(待改進)

題目描述 小易來到了一條石板路前,每塊石板上從1挨著編號為 1 2 3 這條石板路要根據特殊的規則才能前進 對於小易當前所在的編號為k的 石板,小易單次只能往前跳k的乙個約數 不含1和k 步,即跳到k x x為k的乙個非1和本身的約數 的位置。小易當前處在編號為n的石板,他想跳到編號恰好為m的石板去...