题解:

链接: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. 分割数组的最大值相关推荐

  1. LeetCode 410——分割数组的最大值

    1. 题目 2. 解答 此题目为 今日头条 2018 AI Camp 5 月 26 日在线笔试编程题第二道--最小分割分数. class Solution {public:// 若分割数组的最大值为 ...

  2. leetcode 410. 分割数组的最大值(二分法)

    1. 题目描述 给定一个非负整数数组和一个整数 m,你需要将这个数组分成 m 个非空的连续子数组.设计一个算法使得这 m 个子数组各自和的最大值最小.注意: 数组长度 n 满足以下条件:1 ≤ n ≤ ...

  3. LeetCode 410. 分割数组的最大值(极小极大化 二分查找 / DP)

    文章目录 1. 题目 2. 解题 2.1 二分查找 2.2 DP 1. 题目 给定一个非负整数数组和一个整数 m,你需要将这个数组分成 m 个非空的连续子数组. 设计一个算法使得这 m 个子数组各自和 ...

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

    题目描述: 给定一个非负整数数组和一个整数 m,你需要将这个数组分成 m 个非空的连续子数组.设计一个算法使得这 m 个子数组各自和的最大值最小. 注意: 数组长度 n 满足以下条件: 1 ≤ n ≤ ...

  5. Leetcode 410.分割数组的最大值(最优解是二分法)

    Time: 20190904 Type: Hard, DP 题目描述 给定一个非负整数数组和一个整数 m,你需要将这个数组分成 m 个非空的连续子数组.设计一个算法使得这 m 个子数组各自和的最大值最 ...

  6. 7、leetcode410 分割数组的最大值

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

  7. 四边形不等式技巧——分割数组的最大值(画家问题)

    题目 给定一个整型数组arr,数组中的每个值都为正数,表示完成一幅画作需要的时间,再给定一个整数num,表示画匠的数量,每个画匠只能画连在一起的画作.所有的画家并行工作,请返回完成所有的画作需要的最少 ...

  8. 分割数组的最大值—leetcode410

    给定一个非负整数数组和一个整数 m,你需要将这个数组分成 m 个非空的连续子数组.设计一个算法使得这 m 个子数组各自和的最大值最小. 注意: 数组长度 n 满足以下条件: 1 ≤ n ≤ 1000 ...

  9. 410. Split Array Largest Sum 分割数组的最大值

    给定一个非负整数数组和一个整数 m,你需要将这个数组分成 m 个非空的连续子数组.设计一个算法使得这 m 个子数组各自和的最大值最小. 注意: 数组长度 n 满足以下条件: 1 ≤ n ≤ 1000 ...

最新文章

  1. JavaWeb--过滤器
  2. xp 安装mysql数据库_Windows XP系统中安装MySQL5.5.28数据库图文教程
  3. Thread类和Runable接口使用
  4. 详细理解java Hibernate 或 JPA的级联操作
  5. JQuery中$.ajax()方法参数详解(转)
  6. python之函数用法startswith()
  7. 中国十大科技进展2项,世界十大科技进展6项生物相关;相比工程,生物与国际差距还是较大...
  8. L1-065 嫑废话上代码 (5 分)-PAT 团体程序设计天梯赛 GPLT
  9. 蓝桥杯 ALGO-23 算法训练 一元三次方程求解
  10. 开课吧:微服务与DDD解析
  11. 谷歌开源量子计算框架Cirq
  12. 千兆路由器怎么设置网速最快_千兆路由器体验:速度简直太快了
  13. 3个国内最大的黑客学习网站
  14. lisp princ详解_LISP - 输入和输出(Input Output)
  15. 降级论,升维思考,降维攻击
  16. Altium Designer——常见贴片钽电容封装尺寸及特性
  17. 明明没PS,看起来却像PS过的32张照片
  18. 雷蛇zGold与Nexon America建立全球合作伙伴关系
  19. 硬解直显模式实现抓图功能(二)
  20. 给定一个非负整数num,范围中的每个数字i 计算其二进制中1的个数

热门文章

  1. zw版【转发·台湾nvp系列Delphi例程】HALCON HistoToThresh1
  2. JSONObject以及json(转)
  3. linux ext4,ext3的特点和区别
  4. 删除linux系统中的eth0.bak与多余的网卡
  5. 度量网络延迟和吞吐量
  6. C++ 构造函数体内赋值与初始化列表的区别
  7. C# 读取word2003 并且显示在界面上的方法
  8. 针对每个团队提出的意见和建议
  9. 20141113--SQL 事务
  10. linux之ssh-keygen命令