分割数组的最大值
给定一个非负整数数组和一个整数 m,你需要将这个数组分成 m 个非空的连续子数组。设计一个算法使得这 m 个子数组各自和的最大值最小。
注意:
数组长度 n 满足以下条件:
- 1 ≤ n ≤ 1000
- 1 ≤ m ≤ min(50, n)
示例:
输入:
nums = [7,2,5,10,8]
m = 2
输出:
18
解释:
一共有四种方法将nums分割为2个子数组。
其中最好的方式是将其分为[7,2,5] 和 [10,8],
因为此时这两个子数组各自的和的最大值为18,在所有情况中最小。
1 class Solution { 2 public int splitArray(int[] nums, int m) { 3 int size=nums.length; 4 double[][] arr=new double[m][size]; 5 long sum=0; 6 for(int i=0;i<size;i++){ 7 sum+=nums[i]; 8 arr[0][i]=sum; 9 } 10 for(int i=1;i<m;i++){ 11 for(int j=size-1;j>=i;j--){ 12 sum=0; 13 arr[i][j]=Integer.MAX_VALUE; 14 for(int k=j;k>=i;k--){ 15 sum+=nums[k]; 16 double temp=(sum<arr[i-1][k-1])?arr[i-1][k-1]:sum; 17 if(arr[i][j]>temp) arr[i][j]=temp; 18 } 19 } 20 } 21 int result=(int)arr[m-1][size-1]; 22 return result; 23 } 24 }