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

C++で最大2つの要素を反転した後の最大サブアレイ合計


この問題では、配列が与えられます。私たちのタスクは、C++で最大2つの要素を反転した後に最大のサブ配列の合計を見つけるプログラムを作成することです。

問題の説明 −ここでは、配列の任意の2つの数値の符号を反転したときに最大の合計を生成するサブ配列を見つける必要があります。

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

入力 −配列={-5、1、3、8、-2、4、7}

出力 − 30

説明 −インデックス0から6までの要素を検討し、値-5と-2を反転して、最大合計の配列を取得します。

この問題を解決するために、動的計画法を使用します。サイズ1からn(配列の長さ)のすべてのサブ配列の最大合計をチェックします。したがって、サブアレイごとに3つのケースがあります-

ケース1 −サブアレイの2つの要素を反転した後のサブアレイの最大合計。

ケース2 −サブアレイの1つの要素を反転した後のサブアレイの最大合計。

ケース3 −サブアレイのゼロ要素を反転した後のサブアレイの最大合計。

したがって、反復ごとに、配列の最大値と現在の要素を見つけて、その最大値を初期化します。

最大合計をmaxSumという名前の2D配列に格納します。そして、最終的なmaxSumは、2D配列のすべての要素の最大値です。

ソリューションの実装を示すプログラム

#include <bits/stdc++.h>
using namespace std;
int findMaxSubarraySum(int a[], int n) {
   int maxSubarraySum = 0;
   int* arr = new int[n + 1];
   for (int i = 1; i <= n; i++)
      arr[i] = a[i - 1];
   int** maxSum = new int*[n + 1];
   for (int i = 0; i <= n; i++)
      maxSum[i] = new int[3];
   for (int i = 1; i <= n; ++i) {
      maxSum[i][0] = max(arr[i], maxSum[i - 1][0] + arr[i]);
      maxSum[i][1] = max(0, maxSum[i - 1][0]) - arr[i];
      if (i >= 2)
      maxSum[i][1] = max(maxSum[i][1], maxSum[i - 1][1] + arr[i]);
      if (i >= 2)
         maxSum[i][2] = maxSum[i - 1][1] - arr[i];
      if (i >= 3)
         maxSum[i][2] = max(maxSum[i][2], maxSum[i - 1][2] + arr[i]);
      maxSubarraySum = max(maxSubarraySum, maxSum[i][0]);
      maxSubarraySum = max(maxSubarraySum, maxSum[i][1]);
      maxSubarraySum = max(maxSubarraySum, maxSum[i][2]);
   }
   return maxSubarraySum;
}
int main(){
   int arr[] = {-5, 1, 3, 8, -2, 4, 7};
   int n = sizeof(arr) / sizeof(arr[0]);
   cout<<"Maximum subarray sum after inverting at most two elements is "<<findMaxSubarraySum(arr, n);
   return 0;
}

出力

Maximum subarray sum after inverting at most two elements is 30

  1. C++で最大K個の配列要素の符号を反転することによる最大サブ配列の合計

    この問題では、配列と整数kが与えられます。私たちのタスクは、C++で最大k個の配列要素の符号を反転することによって最大のサブ配列の合計を見つけるプログラムを作成することです。 コードの説明 −ここでは、配列を反転する最大k個の要素を見つける必要があります。これにより、この配列から作成されたサブ配列の合計が最大になります。 問題を理解するために例を見てみましょう 入力 −配列={1、-2、7、0} k =2 出力 − 10 説明 − -2である1つの要素のみを反転します。これにより、配列の合計が最大になる10になります。 この問題を解決するために、動的計画法を使用して、i thか

  2. C ++で最大1つの要素を削除した後、サブアレイの最大合計を最大化します

    問題の説明 N個の整数の配列arr[]が与えられます。タスクは、最初に最大のサブ配列の合計を見つけてから、サブ配列から最大で1つの要素を削除することです。削除後の最大合計が最大になるように、最大​​で1つの要素を削除します。 指定された入力配列が{1、2、3、-2、3}の場合、サブ配列の最大合計は{1、3、-2、3}です。次に、-2を削除できます。残りのアレイを削除すると、次のようになります- {1, 2, 3, 3} with sum 9 which is maximum. アルゴリズム 1. Use Kadane’s algorithm to find the maximu