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

C++プログラムで連結を繰り返した後に作成された配列の最大サブ配列合計


この問題では、サイズnと整数kの配列arr[]が与えられます。私たちのタスクは、連結を繰り返した後に作成された配列内の最大のサブ配列の合計を見つけるプログラムを作成することです。

問題の説明 −サブ配列の最大合計は、arrをk回繰り返した後に作成された配列から取得されます。

問題を理解するために例を見てみましょう。

入力

arr[] = {−9, −5, 14, 6} k = 2

出力

26

説明

New array after repeating : {−9, −5, 14, 6, −9, −5, 14, 6}
Subarray with maximum sum = {14, 6, −9, −5, 14, 6}
Sum = 26

ソリューションアプローチ

簡単な解決策は、arr []、k timeを連結した後に形成される新しい配列を作成し、合計が最大のサブ配列を見つけることです。このための最良の方法は、Kadaneのアルゴリズムを使用することです。

ソリューションの動作を説明するプログラム

#include <iostream>
using namespace std;
int calcMaxSubArraySum(int arr[], int n, int k){
   int newArr[2*n];
   for(int i = 0; i < k*n; i++)
   newArr[i] = arr[i%n];
   int maxSum = −1000, sum = 0;
   for (int i = 0; i < k*n; i++) {
      sum = sum + newArr[i];
      if (maxSum < sum)
         maxSum = sum;
      if (sum < 0)
         sum = 0;
   }
   return maxSum;
}
int main(){
   int arr[] = { −9, −5, 14, 6 };
   int k = 2;
   int n = sizeof(arr) / sizeof(arr[0]);
   cout<<"The maximum subarray sum in an array created after repeated concatenation is "<<calcMaxSubArraySum(arr, n, k);
   return 0;
}

出力

The maximum subarray sum in an array created after repeated
concatenation is 26

このアプローチは優れていますが、モジュラー演算を使用して問題を解決するためのより効率的なアプローチが可能です。

モジュラー演算 モジュロ演算子を使用して方程式の余りを取得する場合です。

この問題を解決するために、連結を繰り返して配列を作成する代わりに、モジュラー演算を使用します。残りのソリューションは同じままです。

ソリューションの動作を説明するプログラム

#include <iostream>
using namespace std;
int calcMaxSubArraySum(int arr[], int n, int k){
   int maxSum = −1000, sum = 0;
   for (int i = 0; i < k*n; i++) {
      sum = sum + arr[i%n];
      if (maxSum < sum)
         maxSum = sum;
      if (sum < 0)
         sum = 0;
   }
   return maxSum;
}
int main(){
   int arr[] = { −9, −5, 14, 6 };
   int k = 2;
   int n = sizeof(arr) / sizeof(arr[0]);
   cout<<"The maximum subarray sum in an array created after
   repeated concatenation is "<<calcMaxSubArraySum(arr, n, k);
   return 0;
}

出力

The maximum subarray sum in an array created after repeated
concatenation is 26

  1. C++での配列の最大平均合計パーティション

    問題の説明 配列が与えられた場合、数値Aの行を最大でK個の隣接する(空でない)グループに分割し、スコアは各グループの平均の合計になります。スコアリングできる最大スコアはいくつですか? 例 入力配列が{9、2、5、3、10}の場合、次のように配列を分割できます- {9} {2、5、3}および{10}の場合、これの平均合計は- 9 +(2 + 5 + 3)/ 3 + 10 =22.33 アルゴリズム この問題を解決するために暗記技術を使用することができます- メモ[i][k]を、A[iからn-1]を最大でK個のパーツに分割する最高のスコアとします 最初のグループでは、A[iからn-1

  2. C ++で繰り返し減算してすべての要素を同じにした後、最大配列合計を見つけます

    n個の要素の配列があるとします。すべての要素が同じになるように、すべての要素の可能な最大合計を見つけます。許可される操作は、任意の2つの要素を選択し、それらの大きい方を2つの絶対差で置き換えることだけです。要素が[9、12、3、6]のようなものだとします。その場合、出力は12になります。したがって、最初にA[1]をA[1] – A [3] =12 – 6 =6に置き換えます。したがって、要素は[9、6、3、6]になり、次にA[を置き換えます。 3] with A [3] – A [2] =6 – 3 =3。したがって、要素は[9、6、3、3]です。次に、A[0]をA[0] – A [1] =9