410.分割数组的最大值

410.分割数组的最大值

image-20200725212131652

题解:

​ 设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];
    }
}

猜你喜欢

转载自blog.csdn.net/Rush6666/article/details/107585941
今日推荐