You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
54 lines
1.4 KiB
54 lines
1.4 KiB
package class_2022_02_4_week;
|
|
|
|
import java.util.Arrays;
|
|
|
|
// 测试链接 : https://leetcode.com/problems/partition-array-for-maximum-sum/
|
|
public class Code03_PartitionArrayForMaximumSum {
|
|
|
|
public static int maxSumAfterPartitioning1(int[] arr, int k) {
|
|
int[] dp = new int[arr.length];
|
|
Arrays.fill(dp, -1);
|
|
return process1(arr, k, arr.length - 1, dp);
|
|
}
|
|
|
|
// 永远不变的固定参数 : arr, k
|
|
// 可变参数 : index
|
|
// 缓存 : dp
|
|
// process含义 : arr[0...index]最优划分搞出的最大和是多少,返回
|
|
public static int process1(int[] arr, int k, int index, int[] dp) {
|
|
if (index == -1) {
|
|
return 0;
|
|
}
|
|
if (dp[index] != -1) {
|
|
return dp[index];
|
|
}
|
|
int max = Integer.MIN_VALUE;
|
|
int ans = Integer.MIN_VALUE;
|
|
for (int i = index, j = 1; i >= 0 && j <= k; i--, j++) {
|
|
max = Math.max(max, arr[i]);
|
|
ans = Math.max(ans, process1(arr, k, i - 1, dp) + (index - i + 1) * max);
|
|
}
|
|
dp[index] = ans;
|
|
return ans;
|
|
}
|
|
|
|
public static int maxSumAfterPartitioning2(int[] arr, int k) {
|
|
if (arr == null || arr.length == 0) {
|
|
return 0;
|
|
}
|
|
int n = arr.length;
|
|
int[] dp = new int[n];
|
|
dp[0] = arr[0];
|
|
for (int i = 1; i < n; i++) {
|
|
dp[i] = arr[i] + dp[i - 1];
|
|
int max = arr[i];
|
|
for (int j = i - 1; j >= 0 && (i - j + 1) <= k; j--) {
|
|
max = Math.max(max, arr[j]);
|
|
dp[i] = Math.max(dp[i], max * (i - j + 1) + (j - 1 >= 0 ? dp[j - 1] : 0));
|
|
}
|
|
}
|
|
return dp[n - 1];
|
|
}
|
|
|
|
}
|