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

C++で最大の分割可能なサブセット


明確な正の整数のセットがあるとすると、このサブセット内の要素の(Si、Sj)のようなすべてのペアがSi mod Sj=0またはSjmodSi=0を満たすような最大のサブセットを見つける必要があります。

したがって、入力が[1,2,3]のような場合、可能な結果は[1,2]または[1,3]

のようになります。

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

  • 配列retを作成し、endpoint:=0、retLen:=1、n:=numsのサイズを設定します

  • nが0の場合、空のセットを返します

  • nums配列を並べ替える

  • サイズnの2つの配列lenとparを作成し、lenを1で初期化し、parを0で初期化します

  • 1からn–1の範囲のiの場合

    • par [i]:=i

    • 0からi–1の範囲のjの場合

      • nums [i] mod nums [j]=0かつlen[j]+ 1> len [i]の場合、

        • len [i]:=len [j] + 1

        • par [i]:=j

    • len [j]> retLenの場合、retLen:=len [i]およびendpoint:=i

  • nums[endPoint]をretに挿入します

  • エンドポイントはpar[endPoint]

    と同じではありませんが
    • エンドポイント:=par [endPoint]

    • nums[endPoint]をretに挿入します

  • リストを逆にしてretを返します

例(C ++)

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

#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<auto> v){
   cout << "[";
   for(int i = 0; i<v.size(); i++){
      cout << v[i] << ", ";
   }
   cout << "]"<<endl;
}
class Solution {
   public:
   vector<int> largestDivisibleSubset(vector<int>& nums) {
      vector <int> ret;
      int endPoint = 0;
      int retLen = 1;
      int n = nums.size();
      if(!n) return {};
      sort(nums.begin(), nums.end());
      vector <int> len(n, 1);
      vector <int> par(n, 0);
      for(int i = 1; i < n; i++){
         par[i] = i;
         for(int j = 0; j < i; j++){
            if(nums[i] % nums[j] == 0 && len[j] + 1 > len[i]){
               len[i] = len[j] + 1;
               par[i] = j;
            }
         }
         if(len[i] > retLen){
            retLen = len[i];
            endPoint = i;
         }
      }
      ret.push_back(nums[endPoint]);
      while(endPoint != par[endPoint]){
         endPoint = par[endPoint];
         ret.push_back(nums[endPoint]);
      }
      reverse(ret.begin(), ret.end());
      return ret;
   }
};
main(){
   Solution ob;
   vector<int> v = {1,2,3};
   print_vector(ob.largestDivisibleSubset(v));
}

入力

[1,2,3]

出力

[1, 2, ]

  1. 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]:

  2. C++でKで割り切れるサブアレイの合計

    整数の配列Aがあるとします。合計がkで割り切れる、連続する空でないサブアレイの数を見つける必要があります。 A =[4,5,0、-2、-3,1]およびk =5の場合、出力は7になります。7つのサブ配列があります。 [[4,5,0、-2、-3,1]、[5]、[5,0]、[5,0、-2、-3]、[0]、[0、-2、- 3]、[-2、-3]] これを解決するには、次の手順に従います- 1つのマップmを作成し、m[0]を1に設定します temp:=0、ans:=0、およびn:=配列のサイズa 0からn–1の範囲のiの場合 temp:=temp + a [i] x:=(temp mod