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

C++での平均の最大の合計


数値Aの行を最大でK個の隣接するグループに分割するとし、スコアを各グループの平均の合計として設定します。達成できる最大のスコアを見つける必要があります。 A =[9,1,2,3,9]でKが3であるとすると、結果は20になります。これは、Aを[9]、[1、2、3]に分割することが最善の選択であるためです。 [9]。したがって、答えは9 +(1 + 2 + 3)/ 3 + 9 =20です。Aを[9、1]、[2]、[3、9]、

に分割することもできます。

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

  • 行列dpを定義する
  • 再帰メソッドsolve()を定義します。これには、配列A、インデックス、およびkが必要です。
  • インデックス>=Aのサイズの場合、0を返します
  • kが0の場合、-100000を返します
  • dp [index、k]が– 1でない場合は、dp [index、k]を返します
  • ret:=-infおよびsum:=0
  • for i in range index to size of A – 1
    • 合計:=合計+ A [i]
    • ret:=retとsumの最大値/(i– index + 1)+ resolve(A、i + 1、k – 1)
  • set dp [index、k]:=retandreturn。
  • メインの方法から、次の手順を実行します-
  • n:=Aのサイズ
  • dp:=行列n x(K + 1)、–1で埋める
  • returnsolve(A、0、K)

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

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   vector < vector <double> > dp;
   double solve(vector <int>& A, int idx, int k){
      if(idx >= A.size()) return 0;
      if(!k) return -100000;
      if(dp[idx][k] != -1) return dp[idx][k];
      double ret = INT_MIN;
      double sum = 0;
      for(int i = idx; i < A.size(); i++){
         sum += A[i];
         ret = max(sum / (i - idx + 1) + solve(A, i + 1, k - 1), ret);
      }
      return dp[idx][k] = ret;
   }
   double largestSumOfAverages(vector<int>& A, int K) {
      int n = A.size();
      dp = vector < vector <double> > (n, vector <double>(K + 1, -1));
      return solve(A, 0, K);
   }
};
main(){
   vector<int> v = {9,1,2,3,9};
   Solution ob;
   cout << (ob.largestSumOfAverages(v, 3));
}

入力

[9,1,2,3,9]
3

出力

20

  1. C++のnのすべての除数で最大の桁数の合計を求めます

    この問題では、整数nが与えられます。私たちのタスクは、nのすべての除数で最大の桁の合計を見つけることです。 問題の説明: ここでは、桁の合計が最大である数nの約数を見つけます。 問題を理解するために例を見てみましょう。 入力: 18 出力: 9 説明: 18の約数はすべて1、2、3、6、9、18です。 最大桁数の合計は9です。 ソリューションアプローチ 数値Nのすべての除数を見つけます。次に、各除数の桁の合計を見つけて、合計が最大の値を返します。 ソリューションの動作を説明するプログラム 例 #include <iostream> using names

  2. C++のツリーで最大のサブツリーの合計を検索します

    この問題では、二分木が与えられます。私たちのタスクは、ツリー内で最大のサブツリーの合計を見つけることです。 問題の説明: 二分木は、正の値と負の値で構成されます。そして、ノードの合計が最大のサブツリーを見つける必要があります。 問題を理解するために例を見てみましょう。 出力: 13 説明: 左サブツリーの合計は7です 右サブツリーの合計は1です ツリーの合計は13です ソリューションアプローチ この問題を解決するために、ポストオーダートラバーサルを実行します。ノードの左側のサブツリーと右側のサブツリーの合計を計算します。現在のノードについて、現在のノードの