Problem
Given an integer array arr
, partition the array into (contiguous) subarrays of length at most k
. After partitioning, each subarray has their values changed to become the maximum value of that subarray.
Return **the largest sum of the given array after partitioning. Test cases are generated so that the answer fits in a *32-bit* integer.**
Example 1:
Input: arr = [1,15,7,9,2,5,10], k = 3
Output: 84
Explanation: arr becomes [15,15,15,9,10,10,10]
Example 2:
Input: arr = [1,4,1,5,7,3,6,1,9,9,3], k = 4
Output: 83
Example 3:
Input: arr = [1], k = 1
Output: 1
Constraints:
1 <= arr.length <= 500
0 <= arr[i] <= 10^9
1 <= k <= arr.length
Solution (Java)
class Solution {
public int maxSumAfterPartitioning(int[] arr, int k) {
int n = arr.length;
int[] dp = new int[n];
for (int right = 0; right < n; right++) {
int localMax = arr[right];
for (int left = right; left > Math.max(-1, right - k); left--) {
localMax = Math.max(localMax, arr[left]);
if (left == 0) {
dp[right] = Math.max(dp[right], (right - left + 1) * localMax);
} else {
dp[right] = Math.max(dp[right], dp[left - 1] + (right - left + 1) * localMax);
}
}
}
return dp[n - 1];
}
}
Explain:
nope.
Complexity:
- Time complexity : O(n).
- Space complexity : O(n).