Leetcode Java Partition Array for Maximum Sum
업데이트:
문제
코드
class Solution {
public int maxSumAfterPartitioning(int[] arr, int k) {
int length = arr.length;
int[] dp = new int[length + 1];
for (int i = 1; i <= length; i++) {
int max = 0;
int sum = 0;
for (int j = 1; j <= k && i - j >= 0; j++) {
max = Math.max(max, arr[i - j]);
sum = Math.max(sum, (max * j) + dp[i - j]);
}
dp[i] = sum;
}
return dp[length];
}
}
결과
설명
-
arr을 이용하여 인접한 값들을 최대 k개까지 해당 숫자들 중 가장 큰 값으로 연속되도록 변환할 때, 배열 내 값들의 합이 가장 큰 값을 구하는 문제이다.
- 문제 풀이에 필요한 변수를 정의한다.
- length는 arr의 길이를 저장한 변수이다.
- dp는 배열의 값들을 합한 결과가 가장 큰 값을 계산하기 위한 배열로, $length + 1$ 크기의 정수 배열로 초기화한다.
- 1부터 length 이하까지 i를 증가시키며 아래를 반복한다.
- max와 sum은 가장 큰 값과 합계를 저장할 변수로, 둘 다 0으로 초기화시킨다.
- 1부터 k 이하이면서 $i - j$가 0보다 클 때까지 j를 증가시키며 아래를 반복한다.
- max에 이전까지 최댓값인 max와 현재 값인 arr[$i - j$] 중 큰 값을 저장한다.
- sum에 이전까지 합계인 sum과 현재까지 가장 큰 값을 j번 반복하고 현재 값을 더한 $(max \times j) + dp[i - j]$ 값 중 큰 값을 저장한다.
- dp[i]에 sum을 저장한다.
- 반복이 완료되면 변환된 배열 내 값들의 합이 최대가 되는 값이 저장된 dp[length]의 값을 주어진 문제의 결과로 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기