Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서 최대 하나의 요소를 제거한 후 최대 하위 배열 합계를 최대화합니다.

<시간/>

문제 설명

N 정수의 배열 arr[]이 주어집니다. 작업은 먼저 최대 하위 배열 합계를 찾은 다음 하위 배열에서 최대 하나의 요소를 제거하는 것입니다. 제거 후 최대 합계가 최대화되도록 최대 단일 요소를 제거합니다.

주어진 입력 배열이 {1, 2, 3, -2, 3}이면 최대 하위 배열 합계는 {2, 3, -2, 3}입니다. 그런 다음 -2를 제거할 수 있습니다. 나머지 배열을 제거하면 -

{1, 2, 3, 3} with sum 9 which is maximum.

알고리즘

1. Use Kadane’s algorithm to find the maximum subarray sum.
2. Once the sum has beens find, re-apply Kadane’s algorithm to find the maximum sum again with some minor changes)

예시

#include <bits/stdc++.h>
using namespace std;
int getMaxSubarraySum(int *arr, int n){
   int max = INT_MIN;
   int currentMax = 0;
   for (int i = 0; i < n; ++i) {
      currentMax = currentMax + arr[i];
      if (max < currentMax) {
         max = currentMax;
      }
      if (currentMax < 0) {
         currentMax = 0;
      }
   }
   return max;
}
int getMaxSum(int *arr, int n){
   int cnt = 0;
   int minVal = INT_MAX;
   int minSubarr = INT_MAX;
   int sum = getMaxSubarraySum(arr, n);
   int max = INT_MIN;
   int currentMax = 0;
   for (int i = 0; i < n; ++i) {
      currentMax = currentMax + arr[i];
      ++cnt;
      minSubarr = min(arr[i], minSubarr);
      if (sum == currentMax) {
         if (cnt == 1) {
            minVal = min(minVal, 0);
         } else {
            minVal = min(minVal, minSubarr);
         }
      }
      if (currentMax < 0) {
         currentMax = 0;
         cnt = 0;
         minSubarr = INT_MAX;
      }
   }
   return sum - minVal;
}
int main(){
   int arr[] = {1, 2, 3, -2, 3};
   int n = sizeof(arr) / sizeof(arr[0]);
   cout << "Maximum sum = " << getMaxSum(arr, n) << endl;
   return 0;
}

출력

위의 프로그램을 컴파일하고 실행할 때. 다음 출력을 생성합니다-

Maximum sum = 9