arr이라는 정수 배열과 정수 d가 있다고 가정합니다. 한 단계에서 인덱스 i에서 -
로 이동할 수 있습니다.-
i + x 여기서:i + x
-
i - x 여기서:i - x>=0 및 x 범위 1에서 d.
여기서 n은 배열의 크기입니다. 또한 i와 j 사이의 모든 인덱스 k에 대해 arr[i]> arr[j] 및 arr[i]> arr[k]인 경우에만 인덱스 i에서 인덱스 j로 점프할 수 있습니다. 배열의 인덱스를 선택하고 점프를 시작할 수 있습니다. 방문할 수 있는 최대 인덱스 수를 찾아야 합니다.
따라서 입력이 d =2이고 높이가 다음과 같다면
그러면 출력은 4가 되고 인덱스 10에서 시작할 수 있습니다. 그림과 같이 인덱스 10 --> 8 --> 6 --> 7에서 점프할 수 있습니다. 따라서 인덱스 6에서 시작하면 인덱스 7로만 점프할 수 있습니다. 13> 9 때문에 인덱스 5로 점프할 수 없습니다. 인덱스 5가 인덱스 4와 6 사이에 있고 13> 9이기 때문에 인덱스 4로 점프할 수 없습니다. 또한 인덱스 3에서 인덱스 2 또는 인덱스 1로 이동할 수 없습니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
배열 dp 정의
-
solve() 함수를 정의하면 arr, idx, d,
배열이 사용됩니다. -
dp[idx]가 -1과 같지 않으면 -
-
반환 dp[idx]
-
-
렛 :=1
-
n :=arr의 크기
-
initialize i :=idx + 1의 경우, i
-
i> idx + d이면 -
-
루프에서 나오세요
-
-
arr[i]>=arr[idx]이면 -
-
루프에서 나오세요
-
-
ret :=ret 및 1의 최대값 + solve(arr, i, d)
-
-
initialize i :=idx - 1의 경우, i>=0일 때 업데이트(i를 1만큼 감소), −
-
i
-
루프에서 나오세요
-
-
arr[i]>=arr[idx]이면 -
-
루프에서 나오세요
-
-
ret :=ret 및 1의 최대값 + solve(arr, i, d)
-
-
dp[idx] :=렛
-
리턴 렛
-
주요 방법에서 다음을 수행하십시오 -
-
n :=arr의 크기
-
dp :=크기가 n인 배열을 정의하고 -1로 채우십시오.
-
렛 :=1
-
initialize i :=0의 경우, i
-
ret :=ret 및 solve(arr, i, d)의 최대값
-
-
리턴 렛
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
예
#include <bits/stdc++.h> using namespace std; class Solution { public: vector<int> dp; int solve(vector <int>& arr, int idx, int d){ if (dp[idx] != -1) return dp[idx]; int ret = 1; int n = arr.size(); for (int i = idx + 1; i < n; i++) { if (i > idx + d) break; if (arr[i] >= arr[idx]) break; ret = max(ret, 1 + solve(arr, i, d)); } for (int i = idx - 1; i >= 0; i--) { if (i < idx - d) break; if (arr[i] >= arr[idx]) break; ret = max(ret, 1 + solve(arr, i, d)); } return dp[idx] = ret; } int maxJumps(vector<int>& arr, int d) { int n = arr.size(); dp = vector<int>(n, -1); int ret = 1; for (int i = 0; i < n; i++) { ret = max(ret, solve(arr, i, d)); } return ret; } }; main(){ Solution ob; vector<int> v = {6,4,14,6,8,13,9,7,10,6,12}; cout << (ob.maxJumps(v, 2)); }
입력
{6,4,14,6,8,13,9,7,10,6,12}, 2
출력
4