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

C++의 점프 게임 V


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이고 높이가 다음과 같다면

C++의 점프 게임 V

그러면 출력은 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