最少跳跃次数问题


此问题给出正整数列表。每个整数表示从当前元素可以进行的最大步数。从第一个元素开始,我们必须找到到列表末尾项的最少要跳的次数。

对于动态规划方法,可以定义一个 jumps 数组来存储所需的最少跳跃次数。类似 jumps[i] 的值,它表示从第 0 个索引需要多少最少跳跃次数来达到数组的第 i 个索引。

输入和输出

Input:
A list of integers. {1, 3, 5, 8, 9, 2, 6, 7, 6, 8, 9}
Output:
The minimum number of jumps to reach the end location. It is 3.
Start from value 1, go to 3. then jumps 3 values and reach 8. then jump 8 values and reach the last element.

算法

minPossibleJump(list, n)

输入:数字数组、数组中的元素数量。

输出:到末尾所需的最少跳跃次数。

Begin
   define an array named jump of size n
   if n = 0 or list[0] = 0, then
      return ∞
   jump[0] := 0

   for i := 1 to n, do
      jumps[i] := ∞
      for j := 0 to i, do
         if i <= j + list[j] and jump[j] ≠ ∞, then
            jump[i] := minimum of jump[i] and (jump[j] + 1)
            break the loop
      done
   done

   return jump[n-1]
End

示例

#include<iostream>
using namespace std;

int min(int x, int y) {
   return (x < y)? x: y;
}

int minPossibleJump(int list[], int n) {
   int *jumps = new int[n];     // dynamically create jumps array to store steps
   if (n == 0 || list[0] == 0)
       return INT_MAX;
   jumps[0] = 0;

   for (int i = 1; i < n; i++) {
      jumps[i] = INT_MAX;    //initially set jumps as infinity
      for (int j = 0; j < i; j++) {
         if (i <= j + list[j] && jumps[j] != INT_MAX) {
            jumps[i] = min(jumps[i], jumps[j] + 1);
            break;
         }
      }
   }
   return jumps[n-1];
}

int main() {
   int list[] = {1, 3, 5, 8, 9, 2, 6, 7, 6, 8, 9};
   int size = 11;
   cout << "Minimum number of jumps to reach end is: "<< minPossibleJump(list,size);
   return 0;
}

输出

Minimum number of jumps to reach end is: 3

更新于: 17-6 月 -2020

755 次浏览

启动您的 职业生涯

完成课程并获得认证

开始
广告