문제 설명
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