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

C++でボックスを削除する


異なる色のボックスがいくつかあるとします。これらの色は異なる正の数で表されます。ボックスがなくなるまで、ボックスを削除するために数ラウンドを経験することができます。各ラウンドで、同じ色の連続したボックス(k個のボックスで構成されます。k> =1)をいくつか選択し、それらを削除してk*kポイントを取得できます。したがって、入力が− [1,3,2,2,2,4,4,3,1]の場合、出力は21になります。

あなたが得ることができる最大のポイントを見つけてください。

これを解決するには、次の手順に従います-

  • 関数solve()を定義します。これには、配列ボックスi、j、k、1つの3D配列dpが必要です。
  • i> jの場合、-
    • 0を返す
  • dp [i、j、k]が-1に等しくない場合、-
    • return dp [i、j、k]
  • ret:=-inf
  • 条件i+1 <=jをチェックし、boxes [i +1]はboxes[i]と同じで、更新(iを1増やす)、(kを1増やす)、何もしません-
  • ret:=retの最大値と(k + 1)*(k + 1)+関数solve(boxes、i + 1、j、0、dp)を呼び出す
  • xを初期化する場合:=i + 1、x <=jの場合、更新(xを1つ増やす)、実行-
    • box[x]がboxes[i]と同じ場合、-
      • ret:=retとsolve((boxes、i + 1、x --1、0、dp)+ resolve(boxes、x、j、k + 1、dp))の最大値
  • return dp [i、j、k] =ret
  • メインの方法から、次の手順を実行します
  • n:=ボックスのサイズ
  • 次数(n + 1)x(n + 1)x(n + 1)の3D配列dpを1つ定義し、これに-1を入力します
  • returnsolve(ボックス、0、n-1、0、dp)

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

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   int solve(vector <int>& boxes, int i, int j, int k, vector < vector < vector <int > > >& dp){
      if(i > j) return 0;
      if(dp[i][j][k] != -1) return dp[i][j][k];
      int ret = INT_MIN;
      for(; i + 1 <= j && boxes[i + 1] == boxes[i]; i++, k++);
      ret = max(ret, (k + 1) * (k + 1) + solve(boxes, i + 1, j, 0, dp));
      for(int x = i + 1; x <= j; x++){
         if(boxes[x] == boxes[i]){
            ret = max(ret, solve(boxes, i + 1, x - 1, 0, dp) + solve(boxes, x, j, k + 1,          dp));
         }
      }
      return dp[i][j][k] = ret;
   }
   int removeBoxes(vector<int>& boxes) {
      int n = boxes.size();
      vector < vector < vector <int > > > dp(n + 1, vector < vector <int> > (n + 1, vector <int>(n + 1, -1)));
      return solve(boxes, 0, n - 1, 0, dp);
   }
};
main(){
   Solution ob;
   vector<int> v = {1,3,2,2,2,4,4,3,1};
   cout << (ob.removeBoxes(v));
}

入力

{1,3,2,2,2,4,4,3,1}

出力

21

  1. C++の文字列から後続ゼロを削除します

    このプログラムでは、C++の文字列から末尾のゼロを削除する方法を説明します。一部の文字列には、「00023054」のように末尾のゼロが含まれる場合があります。このプログラムを実行すると、「23054」のみが返されます。最初のゼロは削除されます。 Input: A string with trailing zeros “000023500124” Output: “23500124” アルゴリズム Step 1: Get the string Step 2: Count number of trailing zeros n Step 3: Remo

  2. C++でstd::stringからスペースを削除します

    このプログラムでは、C++でstd::stringからスペースを削除する方法を説明します。これを削除するには、remove()関数を使用します。このremove()関数を使用すると、イテレータの開始と終了を取得し、次にそのイテレータオブジェクトから削除される3番目の引数を取得します。 Input: A string "This is C++ Programming Language" Output: "ThisisC++ProgrammingLanguage" アルゴリズム Step 1: Get the string Step 2: Remove sp