410.分割数组的最大值
题解:
设f[i][j]为从前i个数中分出j个数组,各数组和的最大值最小,设数字k,让k到i的数为一个数组,sub[b]为前b项和。则f[i][j] = Max(f[k][j-1],sub[i] - sub[k+1]) ,比较不同k下f[i][j]的值即可。
class Solution {
public int splitArray(int[] nums, int m) {
int n = nums.length;
int[][] f = new int [n+1][m+1];
for(int i = 0; i <= n;i++){
Arrays.fill(f[i],Integer.MAX_VALUE);
}
int[] sub = new int[n + 1]; //前i项之和
for(int i = 0; i < n; i++){
sub[i+1] = sub[i] + nums[i];
}
f[0][0] = 0;
for(int i = 1;i <= n; i++){
for(int j = 1; j <= Math.min(i,m);j++){
for(int k = 0;k < i;k++){
f[i][j] = Math.min(f[i][j],Math.max(f[k][j-1],sub[i]-sub[k]));
}
}
}
return f[n][m];
}
}