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

合計がC++で最大であるk個の重複しないサブリストの合計を見つけるプログラム


numsと呼ばれる数値のリストがあり、別の値kがあるとすると、それらの合計の合計が最大になるように、k個の重複しない空でないサブリストを見つける必要があります。 kはnumsのサイズ以下であると見なすことができます。

したがって、入力がnums =[11、-1、2、1、6、-24、11、-9、6] k =3の場合、サブリストを選択できるため、出力は36になります[11 、-1、2、1、6]、[11]、および[6]を使用して、[19、11、6]=36の合計を取得します。

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

  • n:=numsのサイズ
  • nが0と同じか、kが0と同じ場合、-
    • 0を返す
  • サイズk+1の配列hiを定義し、-infで埋めます
  • サイズk+1の別の配列を定義し、-infで埋めます
  • hi [0]:=0
  • numsの各num-
    • サイズk+1の配列nopenを定義し、-infで埋めます
    • iを初期化する場合:=1、i <=kの場合、更新(iを1つ増やす)、実行
      • open [i]> -infの場合、-
        • nopen [i]:=open [i] + num
      • hi [i-1]> -infの場合、-
        • nopen [i]:=nopen[i]とhi[i-1]+numの最大値
    • open:=move(nopen)
    • iを初期化する場合:=1、i <=kの場合、更新(iを1つ増やす)、実行
      • hi [i]:=hi[i]とopen[i]の最大値
  • return hi [k]

例(C ++)

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

#include <bits/stdc++.h>
using namespace std;
int solve(vector<int>& nums, int k) {
   int n = nums.size();
   if (n == 0 || k == 0)
      return 0;
   vector<int> hi(k + 1, INT_MIN), open(k + 1, INT_MIN);
   hi[0] = 0;
   for (int num : nums) {
      vector<int> nopen(k + 1, INT_MIN);
      for (int i = 1; i <= k; ++i) {
         if (open[i] > INT_MIN)
            nopen[i] = open[i] + num;
         if (hi[i - 1] > INT_MIN)
            nopen[i] = max(nopen[i], hi[i - 1] + num);
      }
      open = move(nopen);
      for (int i = 1; i <= k; ++i)
      hi[i] = max(hi[i], open[i]);
   }
   return hi[k];
}
int main(){
   vector<int> v = {11, -1, 2, 1, 6, -24, 11, -9, 6};
   int k = 3;
   cout << solve(v, 3);
}

入力

{11, -1, 2, 1, 6, -24, 11, -9, 6}, 3

出力

36

  1. C++のバイナリツリーで最大レベルの合計を見つける

    この問題では、正と負の値を持つ二分木が与えられます。私たちのタスクは、バイナリツリーで最大レベルの合計を見つけることです。 問題の説明: 二分木があります。二分木のすべてのレベルの合計を見つけて、それらの最大値を返します。 問題を理解するために例を見てみましょう 入力: 出力: 5 説明: レベル1:3の要素の合計 レベル2の要素の合計:-3 + 4 =1 レベル3の要素の合計:5 --1 + 6-5 =5 ソリューションアプローチ この問題を解決するには、レベル順トラバーサルを使用してツリーをトラバースする必要があります。そして、レベルごとに、合計

  2. Pythonで重複しない2つのサブリストの最大合計を見つけるプログラム

    numsと呼ばれる数値のリストと2つの値xおよびyがあるとすると、長さxおよびyを持つnums内の重複しない2つのサブリストの最大合計を見つける必要があります。 したがって、入力がnums =[3、2、10、-2、7、6] x =3 y =1の場合、出力は22になります。これは、長さが3のサブリストとして[3、2、 10]と、その他には[7]を選択します。 これを解決するには、次の手順に従います- P:=単一要素0のリスト Aのxごとに、 Pの最後に(P + xの最後の要素)を挿入します 関数solve()を定義します。これにはlen1、len2が必要です Q:=範囲0からP