410. 分割数组的最大值
题解:
链接:https://leetcode-cn.com/problems/split-array-largest-sum/
下面这种情况是dfs是超时的,有时间加一下记忆化
class Solution {
public:int splitArray(vector<int>& nums, int m) {int n = nums.size();vector<vector<long long>> f(n + 1, vector<long long>(m + 1, LLONG_MAX));vector<long 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];}
};
class Solution {
public:int splitArray(vector<int>& nums, int m) {if(nums.size() <= 0) {return 0;}int begin = 0;int step = m;int min_sum = INT_MAX;// 后缀数组和vector<long> prefix_sum(nums.size(), 0);prefix_sum[nums.size()-1] = nums[nums.size()-1];if(nums.size() >= 2) {for(int i = nums.size()-2; i >= 0; --i) {if(prefix_sum[i] == INT_MAX || nums[i] == INT_MAX) {prefix_sum[i] = INT_MAX;} else {prefix_sum[i] = nums[i] + prefix_sum[i+1];}}}vector<int> path;dfs(nums, path, begin, step, min_sum, prefix_sum);return min_sum;}void dfs(vector<int>& nums, vector<int>& path, int begin, int step, int& min_sum, vector<long>& prefix_sum) {if(begin == nums.size()) {return;}if(step == 1) {path.push_back(prefix_sum[begin]);// 取出这种分割情况下的最大值auto max_ite = max_element(path.begin(), path.end());int max_value = *max_ite;// 判断最小值min_sum = min(min_sum, max_value);path.pop_back();return;}int temp_sum = 0;for(int i = begin; i < nums.size(); ++i) {if(temp_sum == INT_MAX || nums[i] == INT_MAX) {temp_sum = INT_MAX;} else {temp_sum += nums[i];}path.push_back(temp_sum);dfs(nums, path, i+1, step-1, min_sum, prefix_sum);path.pop_back();}}
};
410. 分割数组的最大值相关推荐
- LeetCode 410——分割数组的最大值
1. 题目 2. 解答 此题目为 今日头条 2018 AI Camp 5 月 26 日在线笔试编程题第二道--最小分割分数. class Solution {public:// 若分割数组的最大值为 ...
- leetcode 410. 分割数组的最大值(二分法)
1. 题目描述 给定一个非负整数数组和一个整数 m,你需要将这个数组分成 m 个非空的连续子数组.设计一个算法使得这 m 个子数组各自和的最大值最小.注意: 数组长度 n 满足以下条件:1 ≤ n ≤ ...
- LeetCode 410. 分割数组的最大值(极小极大化 二分查找 / DP)
文章目录 1. 题目 2. 解题 2.1 二分查找 2.2 DP 1. 题目 给定一个非负整数数组和一个整数 m,你需要将这个数组分成 m 个非空的连续子数组. 设计一个算法使得这 m 个子数组各自和 ...
- LeetCode 410. 分割数组的最大值
题目描述: 给定一个非负整数数组和一个整数 m,你需要将这个数组分成 m 个非空的连续子数组.设计一个算法使得这 m 个子数组各自和的最大值最小. 注意: 数组长度 n 满足以下条件: 1 ≤ n ≤ ...
- Leetcode 410.分割数组的最大值(最优解是二分法)
Time: 20190904 Type: Hard, DP 题目描述 给定一个非负整数数组和一个整数 m,你需要将这个数组分成 m 个非空的连续子数组.设计一个算法使得这 m 个子数组各自和的最大值最 ...
- 7、leetcode410 分割数组的最大值
leetcode410 分割数组的最大值 给定一个非负整数数组 nums 和一个整数 m ,你需要将这个数组分成 m 个非空的连续子数组. 设计一个算法使得这 m 个子数组各自和的最大值最小. 示例 ...
- 四边形不等式技巧——分割数组的最大值(画家问题)
题目 给定一个整型数组arr,数组中的每个值都为正数,表示完成一幅画作需要的时间,再给定一个整数num,表示画匠的数量,每个画匠只能画连在一起的画作.所有的画家并行工作,请返回完成所有的画作需要的最少 ...
- 分割数组的最大值—leetcode410
给定一个非负整数数组和一个整数 m,你需要将这个数组分成 m 个非空的连续子数组.设计一个算法使得这 m 个子数组各自和的最大值最小. 注意: 数组长度 n 满足以下条件: 1 ≤ n ≤ 1000 ...
- 410. Split Array Largest Sum 分割数组的最大值
给定一个非负整数数组和一个整数 m,你需要将这个数组分成 m 个非空的连续子数组.设计一个算法使得这 m 个子数组各自和的最大值最小. 注意: 数组长度 n 满足以下条件: 1 ≤ n ≤ 1000 ...
最新文章
- JavaWeb--过滤器
- xp 安装mysql数据库_Windows XP系统中安装MySQL5.5.28数据库图文教程
- Thread类和Runable接口使用
- 详细理解java Hibernate 或 JPA的级联操作
- JQuery中$.ajax()方法参数详解(转)
- python之函数用法startswith()
- 中国十大科技进展2项,世界十大科技进展6项生物相关;相比工程,生物与国际差距还是较大...
- L1-065 嫑废话上代码 (5 分)-PAT 团体程序设计天梯赛 GPLT
- 蓝桥杯 ALGO-23 算法训练 一元三次方程求解
- 开课吧:微服务与DDD解析
- 谷歌开源量子计算框架Cirq
- 千兆路由器怎么设置网速最快_千兆路由器体验:速度简直太快了
- 3个国内最大的黑客学习网站
- lisp princ详解_LISP - 输入和输出(Input Output)
- 降级论,升维思考,降维攻击
- Altium Designer——常见贴片钽电容封装尺寸及特性
- 明明没PS,看起来却像PS过的32张照片
- 雷蛇zGold与Nexon America建立全球合作伙伴关系
- 硬解直显模式实现抓图功能(二)
- 给定一个非负整数num,范围中的每个数字i 计算其二进制中1的个数