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

C++에서 m보다 작거나 같은 길이의 최대 합 배열 찾기

<시간/>

문제에서는 길이가 다른 n개의 배열이 제공됩니다. 우리의 임무는 m보다 작거나 같은 길이의 최대 합 배열을 찾는 것입니다.

합계를 최대화하고 결합된 모든 하위 배열의 길이를 m과 같게 만들기 위해 배열에서 하위 배열을 찾아야 합니다.

문제를 이해하기 위해 예를 들어보겠습니다.

입력

n =3, m =4arrOfArr[][] ={ {5, 2, -1, 4, -3} {3, -2, 1, 6} {-2, 0, 5}} 

출력

20

설명

부분배열은 {5, 4}, {6}, {5}, 길이 =2 + 1 + 1 =4Sum =5 + 4 + 6 + 5 =20입니다.

솔루션 접근 방식

동적 프로그래밍 접근 방식을 사용하여 문제를 해결할 수 있습니다. DP 배열을 만들고 0에서 m까지 변하는 길이 k의 누적 배열 합을 계산합니다.

DP 배열에서 2D DP의 foreach 배열에 대해 0에서 m까지의 모든 길이에 대한 최대 배열 합을 저장합니다. 그런 다음 배열의 마지막 행에 있는 최대 합계를 반환합니다.

우리 솔루션의 작동을 설명하는 프로그램

예시

#include 네임스페이스 std;#define N 5int findMax(int ​​a, int b){ if(a> b) return a; return b;}int findMaxSumArray(int arr[][N], int M) { int DP[N][M]; 정수 합계 배열[M]; 정수 합계[M]; memset(DP, -1, sizeof(DP[0][0]) * N * M); 합계 배열[0] =0; DP[0][0] =0; for (int i =1; i <=5; i++) { int len ​​=arr[i - 1][0]; for (int j =1; j <=len; j++) { sumArray[j] =arr[i - 1][j]; 합계배열[j] +=합계배열[j - 1]; 합계[j] =-100; } for (int j =1; j <=len &&j <=6; j++) for (int k =1; k <=len; k++) if (j + k - 1 <=len) sum[j] =findMax(합[j], 합계배열[j + k - 1] - 합계배열[k - 1]); (int j =0; j <=6; j++) DP[i][j] =DP[i - 1][j]; for (int j =1; j <=6; j++) for (int cur =1; cur <=j &&cur <=len; cur++) DP[i][j] =findMax(DP[i][j] , DP[i - 1][j - cur] + 합계[cur]); } 정수 최대 합계 =0; (int i =0, i <=6, i++) maxSum =findMax(maxSum, DP[5][i]); return maxSum;}int main() { int arr[][N] ={ { 3, 2, -1, 6 }, { 2, 7, -1 }, { 3, 2, 2, -4 } }; 정수 m =4; cout<<""< 

출력

길이가 4:15 이하인 최대 합 배열