Split Array Largest Sum
Given an array which consists of non-negative integers and an integer m, you can split the array into m non-empty continuous subarrays. Write an algorithm to minimize the largest sum among these m subarrays.
public class Solution {
int[] sums;
int[][] memo;
int n;
public int splitArray(int[] nums, int m) {
n = nums.length;
sums = new int[n];
memo = new int[n][m + 1];
sums[n - 1] = nums[n - 1];
for(int i = n - 2; i >= 0; i --)
sums[i] = nums[i] + sums[i + 1];
return dfs(nums, 0, m);
}
public int dfs(int[] nums, int start, int m) {
if(m == 1)
return sums[start];
if(memo[start][m] > 0)
return memo[start][m];
int min = Integer.MAX_VALUE;
int sum = 0;
for(int i = start; i <= n - m; i ++){
sum += nums[i];
min = Math.min(min, Math.max(sum, dfs(nums, i + 1, m - 1)));
}
memo[start][m] = min;
return min;
}
}