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