[DynamicProgramming] HackerRank Algorithms in Java ‘Max Array Sum’ solution

1 minute read

Problem

Given an array of integers, find the subset of non-adjacent elements with the maximum sum. Calculate the sum of that subset.

For example, given an array arr = [-2,1,3,-4,5] we have the following possible subsets:

Subset Sum
[-2, 3, 5] 6
[-2, 3] 1
[-2, -4] -6
[-2, 5] 3
[1, -4] -3
[1, 5] 6
[3, 5] 8

Our maximum subset sum is 8.

Sample Input 0

5
3 7 4 6 5

Sample Output 0

13

Solution

현재 위치 i번째 값을 더하는 방법과 더하지 않고 건너 뛰는 방법이 있다.

  • 바로 두칸 뒤에 있는 수와 부분 수열을 만들거나 세칸 뒤에 있는 수와 부분 수열을 만들 수 있다. 둘 중 가장 큰 수를 선택한다.
  • 현재 값이 음수이면 더해도 최고값이 나올 수 없으므로 건너뛴다.
  • 현재 값과, 이전 값과 현재 값을 더한 결과 중 큰 결과를 저장한다.
  • dp배열의 마지막이 항상 최대 값이 나오는 것은 아니다. (이전 단계에서 최대값이 나왔을 수도 있다. 부분 수열의 길이가 반드시 길어야 하는 것은 아니므로) 따라서 최대값을 저장해주어야 한다.

Code

    // Complete the maxSubsetSum function below.
    static int maxSubsetSum(int[] arr) {
        int max = 0;
        
        int[] dp = new int[arr.length + 1];
        dp[0] = 0; dp[1] = arr[0]; dp[2] = arr[1];
        for(int i = 3; i <= arr.length; i++) {
            int tmp = Math.max(dp[i-2], dp[i-3]);
            if(0 <= arr[i-1]) dp[i] = Math.max(arr[i-1], tmp + arr[i-1]);
            else dp[i] = tmp;
            
            max = Math.max(max, dp[i]);
        }
        return max;
    }