网站建设 苏州,建设银行中国网站,fizz wordpress,打电话沟通做网站给定一个非负整数数组 nums 和一个整数 m #xff0c;你需要将这个数组分成 m 个非空的连续子数组。
设计一个算法使得这 m 个子数组各自和的最大值最小。
示例 1#xff1a; 输入#xff1a;nums [7,2,5,10,8], m 2 输出#xff1a;18 解释#xff1a; 一共有四种方法…给定一个非负整数数组 nums 和一个整数 m 你需要将这个数组分成 m 个非空的连续子数组。
设计一个算法使得这 m 个子数组各自和的最大值最小。
示例 1 输入nums [7,2,5,10,8], m 2 输出18 解释 一共有四种方法将 nums 分割为 2 个子数组。 其中最好的方式是将其分为 [7,2,5] 和 [10,8] 。 因为此时这两个子数组各自的和的最大值为18在所有情况中最小。 示例 2 输入nums [1,2,3,4,5], m 2 输出9 示例 3 输入nums [1,4,4], m 3 输出4 提示 1 nums.length 1000 0 nums[i] 106 1 m min(50, nums.length) 来源力扣LeetCode 链接https://leetcode.cn/problems/split-array-largest-sum
方法一动态规划
C提交内容
class Solution {
public:int splitArray(vectorint nums, int m) {int n nums.size();vectorvectorlong long f(n 1, vectorlong long(m 1, LLONG_MAX));vectorlong long sub(n 1, 0);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 min(i, m); j) {for (int k 0; k i; k) {f[i][j] min(f[i][j], max(f[k][j - 1], sub[i] - sub[k]));}}}return (int)f[n][m];}
};