이 문제에서는 배열과 정수 k가 제공됩니다. 우리의 임무는 C++에서 최대 k 배열 요소의 부호를 뒤집어 최대 하위 배열 합을 찾는 프로그램을 만드는 것입니다.
코드 설명 − 여기에서 이 배열에서 생성된 하위 배열의 합이 최대가 되도록 배열에서 뒤집을 최대 k개의 요소를 찾아야 합니다.
문제를 이해하기 위해 예를 들어보겠습니다.
입력 - 배열 ={1, -2, 7, 0} k =2
출력 − 10
설명 - -2인 하나의 요소만 뒤집을 것입니다. 그러면 가능한 최대값인 배열 합이 10이 됩니다.
이 문제를 해결하기 위해 i 번째 배열의 가능한 최대 합을 찾는 동적 프로그래밍 접근 방식을 사용합니다. j 번째 에 대한 인덱스 인덱싱하고 배열 maxSumij[i][j]에 저장하고 요소가 뒤집혔거나 요소가 뒤집히지 않은 경우 두 경우 모두 고려하여 최상의 경우를 반환합니다. 이는 함수에 대한 재귀 호출을 사용하여 수행됩니다. 결국 maxSumij[i][j] 행렬에서 최대 요소를 찾습니다.
예시
솔루션의 작동을 설명하는 프로그램,
#include <bits/stdc++.h> using namespace std; #define right 2 #define left 4 int arraySumij[left][right]; int findSubarraySum(int i, int flips, int n, int a[], int k){ if (flips > k) return -1e9; if (i == n) return 0; if (arraySumij[i][flips] != -1) return arraySumij[i][flips]; int maxSum = 0; maxSum = max(0, a[i] + findSubarraySum(i + 1, flips, n, a, k)); maxSum = max(maxSum, -a[i] + findSubarraySum(i + 1, flips + 1, n, a, k)); arraySumij[i][flips] = maxSum; return maxSum; } int maxSubarraySumFlip(int a[], int n, int k){ memset(arraySumij, -1, sizeof(arraySumij)); int maxSum = -100; for (int i = 0; i < n; i++) maxSum = max(maxSum, findSubarraySum(i, 0, n, a, k)); return maxSum; } int main() { int a[] = {-3, 56, -1, 8}; int n = sizeof(a) / sizeof(a[0]); int k = 2; cout<<"Maximum subarry sum by fipping signs of at most "<<k<<" element is "<<maxSubarraySumFlip(a, n, k); return 0; }
출력
Maximum subarry sum by fipping signs of at most 2 element is 66