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

C++で3で割り切れる最大の合計


整数の配列numsがあるとすると、3で割り切れるような、与えられた配列の要素の可能な最大の合計を見つける必要があります。したがって、入力が[3,6,5,1,8]の場合、サブ配列は[3,6,1,8]であり、合計は18であるため、出力は18になり、3で割り切れます。 。

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

  • n:=nums配列のサイズ
  • サイズ(n + 1)x3の2次元配列dpを1つ作成します
  • set dp [0、0]:=0、dp [0,1]:=-inf、dp [0,2]:=inf
  • 1からnの範囲のiの場合;
    • x:=nums [i-1]
    • 0〜2の範囲のjの場合、dp [i、j]:=dp [i – 1、j]
    • 0〜2の範囲のjの場合
      • k:=(x + j)mod 3
      • dp [i、k]:=dp [i、k]およびdp [i – 1、j]+xの最大値
  • return dp [n、0]

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

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   int maxSumDivThree(vector<int>& nums) {
      int n = nums.size();
      int dp[n+1][3];
      dp[0][0] = 0;
      dp[0][1] = INT_MIN;
      dp[0][2] = INT_MIN;
      for(int i = 1; i <= n; i++){
         int x = nums[i-1];
         for(int j = 0; j < 3; j++)dp[i][j] = dp[i-1][j];
         for(int j = 0; j < 3; j++){
            int k = (x + j) % 3;
            dp[i][k] = max(dp[i][k],dp[i-1][j] + x);
         }
      }
      return dp[n][0];
   }
};
main(){
   vector<int> v = {3,6,5,1,8};
   Solution ob;
   cout << (ob.maxSumDivThree(v));
}

入力

[3,6,5,1,8]

出力

18

  1. C++で3つのスタックの可能な最大合計に等しい合計を見つけます

    正の数のスタックが3つあるとします。最上位要素の削除が許可されているスタックの可能な最大合計を見つける必要があります。スタックは配列として表されます。配列の最初のインデックスは、スタックの最上位要素を表します。スタック要素が[3、10]、[4、5]、[2、1]のようであると仮定します。出力は0になります。合計は、すべてのスタックからすべての要素を削除した後にのみ等しくなります。 これを解決するために、私たちはこの考えに従います。アイデアは、各スタックの合計を比較し、それらが等しくない場合は、最大の合計を持つスタックの一番上の要素を削除することです。次の手順に従います- 個々のスタック内

  2. C ++の合計配列パズル?

    ここでは、配列に関連する1つの興味深い問題を確認します。 n個の要素を持つ配列があります。 n個の要素の別の配列を作成する必要があります。ただし、2番目の配列のi番目の位置は、i番目の要素を除く最初の配列のすべての要素の合計を保持します。そして、1つの制約は、この問題では減算演算子を使用できないことです。 減算演算を使用できれば、すべての要素の合計を取得し、最初の配列のi番目の要素を減算して、2番目の配列のi番目の場所に格納することで、この問題を簡単に解決できます。 ここでは、毎回要素を追加することでこれを解決し、0..n-1のiについては、位置iの要素を無視します。ポイントを得るためのア