문제 설명
주어진 배열 arr[]. arr[]에서 인덱스 i에 대한 접미사 합이기도 한 접두사 합의 최대값을 찾습니다.
예시
입력 배열이 -
인 경우Arr[] ={1, 2, 3, 5, 3, 2, 1} 그러면 출력은 −
와 같이 11입니다.- 접두어 합계 =arr[0..3] =1 + 2 + 3 + 5 =11 및
- 접미사 합계 =arr[3..6] =5 + 3 + 2 + 1 =11
알고리즘
- 배열을 탐색하고 배열 presum[]의 각 인덱스에 대한 접두사 합계를 저장합니다. 여기서 presum[i]는 하위 배열 arr[0..i]의 합계를 저장합니다.
- 배열을 다시 탐색하고 접미사 합계를 다른 배열 suffsum[]에 저장합니다. 여기서 suffsum[i]은 하위 배열 arr[i..n-1]의 합계를 저장합니다.
- 각 인덱스에 대해 presum[i]이 suffsum[i]와 같은지 확인하고 같으면 지금까지 전체 최대값과 비교합니다.
예시
#include <bits/stdc++.h> using namespace std; int getMaxSum(int *arr, int n) { int preSum[n]; int suffSum[n]; int result = INT_MIN; preSum[0] = arr[0]; for (int i = 1; i < n; ++i) { preSum[i] = preSum[i - 1] + arr[i]; } suffSum[n - 1] = arr[n - 1]; if (preSum[n - 1] == suffSum[n - 1]) { result = max(result, preSum[n - 1]); } for (int i = n - 2; i >= 0; --i) { suffSum[i] = suffSum[i + 1] + arr[i]; if (suffSum[i] == preSum[i]) { result = max(result, preSum[i]); } } return result; } int main() { int arr[] = {1, 2, 3, 5, 3, 2, 1}; int n = sizeof(arr) / sizeof(arr[0]); cout << "Max equlibrium sum = " << getMaxSum(arr, n) << endl; return 0; }
출력
위의 프로그램을 컴파일하고 실행할 때. 다음 출력을 생성합니다 -
Max equlibrium sum = 11