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