LeetCode-410.分割数组的最大值

原题链接:https://leetcode.cn/problems/split-array-largest-sum/description

题面

给定一个非负整数数组 nums 和一个整数 k ,你需要将这个数组分成 k 个非空的连续子数组。设计一个算法使得这 k 个子数组各自和的最大值最小。

思路

数组定义:f[i][j]: 前i个数字,分为j段各自和的最大值

状态方程定义:f[i][j] = Math.min(f[i][j], Math.max(f[k][j-1]+sub(i)-sub(k))) #sub为前缀和

初始化:k=0状态不存在,则f[0][0]=0,需要求最小值则将其余的设置为最大值即可

代码

	// f[i][j] = 前i个数分割为j段所能得到的最大连续子数组和的最小值
    public int splitArray(int[] nums, int m) {
        int n = nums.length;

        int[][] f = new int[n + 1][m + 1];

        // init dp
        for (int i = 0; i <= n; i++) {
            Arrays.fill(f[i], Integer.MAX_VALUE);
        }
        f[0][0] = 0;

        //prefix
        int[] sub = new int[n + 1];
        for (int i = 1; i <= n; i++) {
            sub[i] = sub[i - 1] + nums[i - 1];
        }

        // dp
        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];
    }

你可能感兴趣的:(LeetCode,DP,leetcode,算法,排序算法)