網易跳石板問題詳解

2021-10-23 08:45:27 字數 717 閱讀 5389

基本思想:dp演算法

首先建立乙個最大值+1那麼大的陣列表示每乙個石板,之所以是最大值+1的原因是要取下標為最大值的石板

然後遍歷每個石板,把每個石板的約數都儲存起來,然後取到從這個石板過去的最小值(即最優解)

然後取最大值對應的那個石板返回就ok

dp演算法的核心思維其實就是每一步取最優解,它也是一種分治思想的深刻體現

#include

#include

#include

using namespace std;

void gainstep(int n, vector& arr)

//}//這樣子的話因為演算法複雜度太大過不了,所以我們簡化一下

//因為乙個數的約數不可能超過它的開方,所以只要遍歷它開方前的數字,如果它是n的約數,那麼把它和n/它的值扔進去就行

//當讓遇到商和除數一樣的扔乙個就行比如4=2*2扔乙個2就行

for (int i = 2; i <= sqrt(n); i++)}}

}void getminroute(int n, int m)

//如果沒人跳過,那沒得商量直接走

else}}

}//取出dp裡邊最後一步的值即可,當然,如果它沒有被走過,那麼它的值勢必為0,直接輸出-1就ok

if (dp[m] == 0)

cout << 「-1」 << endl;

else

}int main()

跳石板(詳解)

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

跳石板問題 C

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

跳石板 網易2017秋招程式設計題

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