-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy path1043.java
More file actions
48 lines (48 loc) · 1.32 KB
/
Copy path1043.java
File metadata and controls
48 lines (48 loc) · 1.32 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
// 1043. Partition Array for Maximum Sum
//
// 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] <= 109
// 1 <= k <= arr.length
//
// Runtime 6 ms Beats 86.80%
// Memory 40.6 MB Beats 98.37%
class Solution {
public int maxSumAfterPartitioning(int[] arr, int k) {
int[] memory = new int[arr.length + 1];
int sum = 0;
for (int i = 1; i < memory.length; i++) {
int max = 0;
int sub = 0;
for (int j = 1; j <= k; j++) {
if (i - j < 0) break;
max = Math.max(max, arr[i - j]);
sub = Math.max(sub, memory[i - j] + max * j);
}
memory[i] = sub;
}
return memory[memory.length - 1];
}
}