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

C++のカードから取得できる最大ポイント


複数のカードが一列に配置され、各カードにポイントが関連付けられており、これらのポイントがcardPointsと呼ばれる整数配列で指定されているとします。 1つのステップで、行の最初または最後から1枚のカードを取得できます。正確にk枚のカードを取る必要があります。最終的なスコアは、私たちが取ったカードのポイントの合計になります。したがって、整数配列cardPointsと整数kがある場合は、取得できる最大スコアを見つけます。

したがって、入力がcardPoints =[1,2,3,4,5,6,1]、k =3の場合、最初のステップの後、スコアは常に1になるため、出力は12になります。 、最初に右端のカードを選択すると、合計スコアが最大になります。最適な戦略は、右側の3枚のカードを取り、最終スコアを1 + 6 + 5=12にすることです。

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

  • 2つの配列pre1とprev2を定義し、v

    で初期化します。
  • ret:=0

  • n:=vのサイズ

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

    • pre1 [i]:=pre1 [i] + pre1 [i-1]

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

    • pre2 [i]:=pre2 [i] + pre2 [i + 1]

  • k> =nの場合、-

    • pre1[n-1]を返す

  • i:=k-1

  • ret:=pre1 [i]

  • (iを1減らします)

  • j:=n-1

  • i> =0の場合、実行-

    • ret:=retの最大値と(pre1 [i] + pre2 [j])

    • iとjを1減らします

  • ret:=retとpre2の最大値[n-k]

  • retを返す

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

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   int maxScore(vector<int>& v, int k) {
      vector<int> pre1(v.begin(), v.end());
      vector<int> pre2(v.begin(), v.end());
      int ret = 0;
      int n = v.size();
      for (int i = 1; i < n; i++) {
         pre1[i] += pre1[i - 1];
      }
      for (int i = n - 2; i >= 0; i--) {
         pre2[i] += pre2[i + 1];
      }
      if (k >= n) {
         return pre1[n - 1];
      }
      int i = k - 1;
      ret = pre1[i];
      i--;
      int j = n - 1;
      while (i >= 0) {
         ret = max(ret, pre1[i] + pre2[j]);
         i--;
         j--;
      }
      ret = max(ret, pre2[n - k]);
      return ret;
   }
};
main(){
   Solution ob;
   vector<int> v = {1,2,3,4,5,6,1};
   cout << (ob.maxScore(v, 3));
}

入力

{1,2,3,4,5,6,1}

出力

12

  1. C++でN*Nチェス盤に配置できる最大のビショップ

    チェス盤のサイズを示す入力Nが与えられます。ここでのタスクは、Nの任意の値について、2人のビショップが互いに攻撃できないようにNXNチェス盤に配置できるビショップの数を見つけることです。例を挙げて理解しましょう。 入力 − n =2 出力 − N * Nチェス盤に配置できる最大のビショップ− 2(上記のように) 説明 −上に示したように、矛盾しない位置は司教が配置されている場所だけです。せいぜい2X2チェス盤のビショップ。 入力 − n =5 出力 − N * Nチェス盤に配置できる最大ビショップ:8(上記のように) 以下のプログラムで使用されているアプローチは次のとおりで

  2. C++で下から右に光を転送できる最大ミラー

    0と1のみを含む正方行列が与えられます。 0は空白または空の場所を表し、1は障害物を意味します。これらのミラーが下から右に光を転送できるように、空のセルに配置できるミラーをいくつか見つける必要があります。これは、ミラーがインデックス[i、j]に配置され、その特定の行(i)の右側のすべてのセルと、その特定の列の下部(j)のセルに障害物がない場合に可能です。 ミラーがA[i][j]にある場合、すべてのA [i+1からn][j]およびA[i][j + 1からn]は空、つまり0です。次の図に示すように。 入力 Arr[][] = {{0,0,1,0,0},{0,0,0,0,0},{0,0,0