이 문제에서는 양의 정수 목록이 제공됩니다. 각 정수는 현재 요소에서 만들 수 있는 최대 단계 수를 나타냅니다. 첫 번째 요소부터 시작하여 목록의 최종 항목에 도달하기 위한 최소 점프 수를 찾아야 합니다.
동적 프로그래밍 방식의 경우 필요한 최소 점프 수를 저장하도록 점프 배열이 정의됩니다. 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