Computer >> 컴퓨터 >  >> 프로그램 작성 >> 프로그램 작성

최소 점프 수 문제


이 문제에서는 양의 정수 목록이 제공됩니다. 각 정수는 현재 요소에서 만들 수 있는 최대 단계 수를 나타냅니다. 첫 번째 요소부터 시작하여 목록의 최종 항목에 도달하기 위한 최소 점프 수를 찾아야 합니다.

동적 프로그래밍 방식의 경우 필요한 최소 점프 수를 저장하도록 점프 배열이 정의됩니다. 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