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

C++プログラムで開始値と終了値が同じになるような最大合計サブ配列


この問題では、正の値で構成されるサイズnの配列arr[]が与えられます。私たちのタスクは、開始値と終了値が同じになるように最大合計サブ配列を見つけるプログラムを作成することです。

問題の説明 −ここで、インデックスi(サブアレイの開始インデックス)とj(サブアレイの終了インデックス)の要素が同じになるように、つまりarr [i] =arr[j]となるサブアレイを見つける必要があります。そして、サブアレイの要素の合計が最大化されます。

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

入力

arr[] = {2, 1, 3, 5, 6, 2, 4, 3}

出力

23

説明

All subarrays which are starting and ending with the same element are:
{2, 1, 3, 5, 6, 2} = 2 + 1 + 3 + 5 + 6 + 2 = 19
{3, 5, 6, 2, 4, 3} = 3 + 5 + 6 + 2 + 4 + 3 = 23

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

この問題を解決するには、正の値の場合、サブアレイの合計が、検討するサブアレイのサイズとともに増加するという事実を考慮する必要があります。このために、配列内の数字の左端と右端の出現箇所を見つけることにより、最大サイズのサブ配列を見つけます。そして、maxSumを超える場合は、合計を返します。

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

#include <bits/stdc++.h>
using namespace std;
int maxValue(int arr[], int n) {
   unordered_map<int, int> startIndex, endIndex;
   int sumArr[n];
   sumArr[0] = arr[0];
   for (int i = 1; i < n; i++) {
      sumArr[i] = sumArr[i − 1] + arr[i];
      if (startIndex[arr[i]] == 0)
         startIndex[arr[i]] = i;
      endIndex[arr[i]] = i;
   }
   int maxSum = 0;
   for (int i = 0; i < n; i++) {
      int left = startIndex[arr[i]];
      int right = endIndex[arr[i]];
      maxSum = max(maxSum, sumArr[right] − sumArr[left − 1]);
   }
   return maxSum;
}
int main() {
   int arr[] = { 2, 1, 3, 5, 6, 2, 4, 3 };
   int n = sizeof(arr) / sizeof(arr[0]); 
   cout<<"The maximum sum subarray such that start and end values are same is "<<maxValue(arr, n);
   return 0;
}

出力

The maximum sum subarray such that start and end values are same is 23

  1. C++で2つの要素が隣接しないような循環配列の最大合計

    この問題では、循環配列cirArr[]が与えられます。私たちのタスクは、C++で2つの要素が隣接しないように循環配列の最大合計を見つけるプログラムを作成することです。 問題の説明 循環配列の場合、隣接する要素を取得できないように、配列の要素の最大合計を見つける必要があります。つまり、代替要素を取得する必要があります。 循環アレイ は、配列の最後の要素が最初の要素に接続されている特殊なタイプの配列です。 問題を理解するために例を見てみましょう 入力 cirArr[] = {4, 1, 5, 3, 2} 出力 9 説明 最大合計循環サブシーケンスは[4、5、2]です。合計=9 ソリ

  2. C++で分割統治アルゴリズムを使用した最大サブアレイ合計

    正の値と負の値を持つデータのリストが1つあるとします。合計が最大である連続するサブ配列の合計を見つける必要があります。リストに{-2、-5、6、-2、-3、1、5、-6}が含まれているとすると、最大サブ配列の合計は7になります。これは{6、-2、-3の合計です。 、1、5} この問題は、分割統治法を使用して解決します。手順は次のようになります- 手順 − アレイを2つの部分に分割します 次の3つのうち最大のものを見つけます 左側のサブアレイの最大サブアレイ合計 右サブアレイの最大サブアレイ合計 サブアレイが中点を横切るようなサブアレイの最大合計 例 #include <i