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

C++で配列の最大合計を分割


正の整数の配列と1つの値mがあるとします。この配列をm個の連続するサブ配列に分割できます。これらのm個のサブアレイの中で最大の合計を最小化するアルゴリズムを考案する必要があります。

したがって、配列が[7,2,4,10,9]であり、m =2の場合、[7,2,4]と[10,9]のような2つのサブ配列を作成できるため、合計は19になります。 、合計が最大のサブ配列は19です。

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

  • 関数splitArray()を定義します。これには、配列v、mが必要です。
  • n:=vのサイズ
  • サイズの1つの配列dpを作成します
  • サイズnの別の配列の合計を作成します
  • sum [0]:=v [0]
  • iを初期化する場合:=1、i
  • sum [i]:=sum [i-1] + v [i]
  • dp [0]:=sum [n-1]
  • iを初期化する場合:=1、i
  • dp [i]:=sum [n-1] --sum [i-1]
  • iを初期化する場合:=1、i
  • startを初期化する場合:=0、start
  • 初期化の場合end:=start + 1、end <=n --iの場合、更新(endを1増やします)、実行-
  • dp [start]:=最小のdp [start]と最大の(startが0の場合はsum [end-1]、それ以外の場合はsum [end-1] --sum [start-1])とdp [end]
  • return dp [0]
  • 理解を深めるために、次の実装を見てみましょう-

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long int lli;
    class Solution {
    public:
       int splitArray(vector<int>& v, int m) {
          int n = v.size();
          vector <long long int > dp(n);
          vector <long long int> sum(n);
          sum[0] = v[0];
          for(int i =1;i<n;i++)sum[i] =sum[i-1]+v[i];
          dp[0] = sum[n-1];
          for(int i =1;i<n;i++){
             dp[i] = sum[n-1] - sum[i-1];
          }
          for(int i =1;i<m;i++){
             for(int start = 0;start<n-i;start++){
                for(int end = start+1;end<=n-i;end++){
                   dp[start] = min(dp[start],max((start==0?sum[end-1]:sum[end-1]-sum[start-1]),dp[end]));
                }
             }
          }
          return dp[0];
       }
    };
    main(){
       Solution ob;
       vector<int> v = {7,2,4,10,9};
       cout << (ob.splitArray(v, 2));
    }

    入力

    [7,2,4,10,9]
    2

    出力

    19

    1. C++合計配列パズル

      配列 同じデータ型の複数の要素を格納するデータ構造です。値のセット全体を一度に保存できます。ただし、その長さは事前に定義する必要があります。 この合計配列パズルでは、nと言う明確なサイズの配列A1が与えられます。このパズルを解くために、位置が使用されている要素を除く配列のすべての要素の合計を格納するS1という配列を作成します。たとえば、S1 [3]が計算されている場合、位置4の要素を除くA1のすべての要素の合計が求められます。 例- Array A1 = {1,2,3,4,6} Output S1 = {15,14,13,12,10} 説明 −合計配列を計算するには、初期配列の各要素を合計

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

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