当前位置: 首页 > news >正文

高淳网站建设/数据分析师证书

高淳网站建设,数据分析师证书,网络平台设计公司广东,amazon免费虚拟机做网站leetcode410. 分割数组的最大值给定一个非负整数数组和一个整数 m,你需要将这个数组分成 m 个非空的连续子数组。设计一个算法使得这 m 个子数组各自和的最大值最小。注意:数组长度 n 满足以下条件:1 ≤ n ≤ 10001 ≤ m ≤ min(50, n)示例:输入: nums [7,2,5,10,8…

leetcode410. 分割数组的最大值

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

注意:

数组长度 n 满足以下条件:

  • 1 ≤ n ≤ 1000
  • 1 ≤ m ≤ min(50, n)

示例:

输入:
nums = [7,2,5,10,8]
m = 2输出:
18解释:
一共有四种方法将nums分割为2个子数组。
其中最好的方式是将其分为[7,2,5] 和 [10,8],
因为此时这两个子数组各自的和的最大值为18,在所有情况中最小。

方法:动态规划

思路:

这道题应该使用动态规划的方法。

我们设dp(i,j)表示将前i+1个数分为j+1组情况下的答案,那么最后的答案即为dp(n-1,m-1)。

下面我们考虑状态转移方程,对于dp(i,j),我们可知,它与dp(x,j-1)有关。即最后一个分组在哪,此时如果x=1,那么此时最后一个分组为nums[1:j+1],此时这种分组情况的和的最大值为max(dp(x,j-1),sum(nums[1:j+1]))。那么我们遍历所有可能的x,找到这些情况中的最小值,即为dp(i,j)的值。x可能的取值为[j-1,i-1]。

所以,状态转移方程为:

下面考虑边界条件,dp(0,0) = nums[0]

我们可知,任意时刻,i>=j才行。所以我们先遍历,填写所有的dp(i,i)。

然后考虑j = 0的情况,即整个分为1组,那么此时的dp即为前i的和,所以遍历填写dp(i,0)。

在正式遍历填写dp的时候,按照以下的循环:

# i从1开始for i in range(1,n):# j需要小于等于i,且j<m,且j==i的上面已经填写,for j in range(1,min(i,m)):# k的范围for k in range(j-1,i):

同时,我们还发现,dp[:] [0]对应的数组即为前缀和数组,因此sum(nums[k+1:i+1])可以通过dp[i][0]-dp[k][0]求得。因此状态转移方程可以改为:

最后答案返回dp(n-1,m-1)即可。

代码:

代码:

Python3:

class Solution:def splitArray(self, nums: List[int], m: int) -> int:n = len(nums)# dp[i][j]表示前i+1个数,分成j+1组,各自和最大值的最小# 答案为dp[n-1][m-1]dp = [[float('inf') for _ in range(m)] for _ in range(n)]dp[0][0] = nums[0]# 将一个数分为一组的情况,最多是前m个数分为m组for i in range(1,m):dp[i][i] = max(dp[i-1][i-1],nums[i])# 将i+1个数分为1组,那么答案即为数组的和,同样也表示前缀和for i in range(1,n):dp[i][0] = dp[i-1][0] + nums[i]# 开始填写dp数组。# dp[i][j] = min(max(dp[k][j-1],sum(nums[k+1:i+1]))) k取值为(j-1,i)# sum(nums[k+1:i+1])可以通过dp[i][0]-dp[k][0]求得。for i in range(1,n):for j in range(1,min(i,m)):for k in range(j-1,i):dp[i][j] = min(dp[i][j],max(dp[k][j-1],dp[i][0]-dp[k][0]))return (int)dp[n-1][m-1]

Cpp:

class Solution {
public:int splitArray(vector<int>& nums, int m) {int n = nums.size();vector<vector<long long>> dp(n, vector<long long>(m, LLONG_MAX));dp[0][0] = nums[0];for (int i = 1;i < n;++i) dp[i][0] = dp[i-1][0] + nums[i];for (int i = 1;i < m;++i) dp[i][i] = max(dp[i-1][i-1],(long long)nums[i]);for (int i = 1;i < n;++i){for (int j = 1;j < min(i,m);++j){for (int k = j-1; k<i ;++k){dp[i][j] = min(dp[i][j],max(dp[k][j-1],dp[i][0]-dp[k][0]));}}}return (int)dp[n-1][m-1];}
};

结果:

3ac197ac0c974cf78133aeee44a5bc4d.png

3e6b4649675bd43408833497666588e5.png
http://www.lbrq.cn/news/1419571.html

相关文章:

  • 哪里有营销型网站制作/河北企业网站建设
  • 网商之窗官网/关于seo的行业岗位有哪些
  • 网站如何做单项链接/国际新闻头条今日要闻
  • 泉州网站建设开发/企业官网
  • wordpress搜索收录/外贸建站优化
  • 没有数据怎么做网站/360网站关键词排名优化
  • 做那种网站赚钱/莆田seo推广公司
  • 农村电商网站建设方案/网络营销方法有哪些举例
  • wordpress付费查看全文内容/seo百度推广
  • 嘉兴建设网站/适合网络营销的产品
  • 注册完域名后如何做网站/在线h5免费制作网站
  • 几个做ppt的网站知乎/seo教程网
  • 做网站为什么没收入/群排名优化软件官网
  • shopbase建站费用/手机如何制作自己的网站
  • 做网站设计需要具备哪些/北京网络营销咨询公司
  • 网站你懂我意思正能量晚上在线下载免费软件魅族/seo网站优化教程
  • 网站注册商是什么/上海百度搜索优化
  • 西安网站制作哪家便宜又好/上海还能推seo吗
  • 公司企业邮箱是什么/网站优化推广公司排名
  • 科技资讯网站开发/企业seo排名外包
  • 海淀区网站制作公司/手机如何制作网页
  • 深圳那家做网站好/宁波pc营销型网站制作
  • 网站开发用的软件/seo优化操作
  • 广州网站建设电话/谷歌浏览器网址
  • 徐州网站制作怎样/什么网站可以发布广告
  • 做网站源代码/海外推广营销 平台
  • 泛搜索wordpress/seo高端培训
  • 建设实业公司网站设计模板/seo零基础入门到精通200讲
  • 兼职做效果图的网站/我要下载百度
  • 厦门百度整站优化服务/广告联盟app推广
  • 为何她总在关键时“失联”?—— 解密 TCP 连接异常中断
  • 勾股数-洛谷B3845 [GESP样题 二级]
  • GEEPython-demo1:利用Sentinel-2监测北京奥林匹克森林公园2024年NDVI变化(附Python版)
  • 链式二叉树的基本操作——遍历
  • 机器学习——PCA(主成分分析)降维
  • Python入门第3课:Python中的条件判断与循环语句