C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++でゲームVをジャンプする


arrと呼ばれる整数の配列と整数dがあるとします。 1つのステップで、インデックス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]

      を返します
  • ret:=1

  • n:=arrのサイズ

  • 初期化i:=idx + 1の場合、i

    • i> idx + dの場合、-

      • ループから出てきます

    • arr [i]> =arr [idx]の場合、-

      • ループから出てきます

    • ret:=retと1の最大値+solve(arr、i、d)

  • 初期化i:=idx -1の場合、i> =0の場合、更新(iを1つ減らす)、実行-

    • i

      • ループから出てきます

    • arr [i]> =arr [idx]の場合、-

      • ループから出てきます

    • ret:=retと1の最大値+solve(arr、i、d)

  • dp [idx]:=ret

  • retを返す

  • メインの方法から、次のようにします-

  • n:=arrのサイズ

  • dp:=サイズnの配列を定義し、これに-1を入力します

  • ret:=1

  • 初期化i:=0の場合、i

    • ret:=retとsolve(arr、i、d)の最大値

  • retを返す

理解を深めるために、次の実装を見てみましょう-

#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

  1. C++でゲームIVをジャンプする

    arrという整数の配列があるとします。最初はインデックス0にいます。1つのステップで、インデックスiからi + xにジャンプできます。ここで、i +x =0。jここで:arr[i]とarr[j]は同じであり、iとjは同じではありません。ここで、nは配列のサイズです。配列の最後のインデックスに到達するための最小ステップ数を見つける必要があります。 したがって、入力が次のような場合、 その場合、出力は3になります。インデックス0から4、3から9への3つのジャンプが必要です。 これを解決するには、次の手順に従います- 1つのマップを定義するm n:=arrのサイズ 初期

  2. Pythonのジャンプゲーム

    非負の整数の配列があるとします。最初は、配列の最初のインデックスに配置されます。指定された配列の各要素は、その位置での最大ジャンプ長を表します。最後のインデックスに到達できるかどうかを判断する必要があります。したがって、配列が[2,3,1,1,4]のような場合、出力はtrueになります。これは、位置0から1に1ステップジャンプし、次に位置1から最後に3ステップジャンプするようなものです。 手順を見てみましょう- n:=配列Aの長さ– 1 for i:=n – 1、-1まで nの場合、n:=i n =0の場合はtrueを返し、それ以外の場合はfalseを返します 理解を深