创造有价值的网站,网站设计项目书,wordpress设置菜单导航,wordpress主页图片不显示原题链接#xff1a;https://leetcode.cn/problems/split-array-largest-sum/description 题面 给定一个非负整数数组 nums 和一个整数 k #xff0c;你需要将这个数组分成 k 个非空的连续子数组。设计一个算法使得这 k 个子数组各自和的最大值最小。 思路 数组定义#xff…原题链接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为前缀和
初始化k0状态不存在则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 dpfor (int i 0; i n; i) {Arrays.fill(f[i], Integer.MAX_VALUE);}f[0][0] 0;//prefixint[] sub new int[n 1];for (int i 1; i n; i) {sub[i] sub[i - 1] nums[i - 1];}// dpfor (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];}