題目分析:
這道題就是計算從n開始加,最少加幾次等於m,前提條件是每次相加的數必須是當前數的約數
思路分析:
將m個石板看做乙個儲存結果的陣列jumpnum,每個jumpnum[i]中都儲存著從n到當前位置最小的步數,如果是0,則說明不能走到這個位置。從起點開始對jumpnum進行遍歷,先求當前位置的所有約數也就是當前位置可以向前走的步數,然後更新到能到達的位置的最小步數。之前沒有來過這個位置,就將該位置更新為當前步數+1,否則更新為之前的步數和當前步數+1兩者最小的,經過遍歷一一次後得到結果,jumpnum[m]就是從n開始加,加到m的最少次數,如果是0,說明不可能加到m。
**思路:
上**:
#include
#include
#include
using
namespace std;
//計算約數,求除了1和本身的約數
void
divisornum
(int n, vector<
int>
& divnum)}}
intjump
(int n,
int m)
}for
(int i =
0; i < stepnum.
size()
;++i)
cout << endl;
if(stepnum[m]==0
)return-1
;else
//初始化時多給了一步,故需要減1
return stepnum[m]-1
;}intmain()
網易跳石板問題詳解
基本思想 dp演算法 首先建立乙個最大值 1那麼大的陣列表示每乙個石板,之所以是最大值 1的原因是要取下標為最大值的石板 然後遍歷每個石板,把每個石板的約數都儲存起來,然後取到從這個石板過去的最小值 即最優解 然後取最大值對應的那個石板返回就ok dp演算法的核心思維其實就是每一步取最優解,它也是一...
跳石板(待改進)
題目描述 小易來到了一條石板路前,每塊石板上從1挨著編號為 1 2 3 這條石板路要根據特殊的規則才能前進 對於小易當前所在的編號為k的 石板,小易單次只能往前跳k的乙個約數 不含1和k 步,即跳到k x x為k的乙個非1和本身的約數 的位置。小易當前處在編號為n的石板,他想跳到編號恰好為m的石板去...
跳石板問題 C
小易來到了一條石板路前,每塊石板上從1挨著編號為 1 2 3 這條石板路要根據特殊的規則才能前進 對於小易當前所在的編號為k的石板,小易單次只能往前跳k的乙個約數 不含1和k 步,即跳到k x x為k的乙個非1和本身的約數 的位置。小易當前處在編號為n的石板,他想跳到編號恰好為m的石板去,小易想知道...