最小m段和问题 动态规划 c++含讲解

博客介绍了如何解决最小m段和问题,利用动态规划求解当给定n个整数序列和m段分割时,如何使得m段子序列和的最大值最小。通过关键函数solve,分析了两种情况:j=1时不分段,j>=2时将序列分为两部分,不断寻找子序列和最大值最小的解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最小m段和问题
给定n个整数组成的序列,现在要求将序列分割为m段,每段子序列中的数在原序列中连续排列。如何分割才能使这m段子序列的和的最大值达到最小?

刚刚写了最大k乘积问题的分析,再过来看这道题,感觉差不多,如果你有兴趣的话,可以看看【动态规划】最大k乘积问题

分析-----美丽的分界线-------
1.问题讲解
5 4 3 2 1 n=5,m=3 5个整数,3段
3段子序列 (5/4/3 2 1,5 4/ 3/ 2 1,5 4 3/2 /1,5/4 3 2 /1)
子序列的和最大:(分别为6,9,12,9)
最大值达到最小即为6
2.代码讲解
solve函数是这道题的关键
f[i][j]:前i个数被分为j段,子序列的和最大值的最小值
t[i]:用来存储数字序列的数组
(1)j=1:不分段
f[i][1]=f[i-1][1]+t[i]; 前i-1个数和+第i个数
(2)j>=2
maxt=max(f[k][j-1],f[i][1]-f[k][1]);
这道题就是将数字序列整体分为两部分,第一部分前k个数分为j-1段,得到子序列的和最大值的最小值,另一部分是最后一段,f[i][1]-f[k][1]:i个数的和-前k个数的和 即为最后一段的和
然后进行比较,得到最大的和
可是呢,还有一个要求,就是要求得到的最大的和是最小的(千万不要绕晕啊,哈哈)
所以用了mint ,通过k的变化,不同的分法,得到的maxt不同,找到最小的,
随着i,j不断增加直至达到n,m即可得到答案啦

#include<bits/stdc++.h>
using namespace std;
void solve(int n,int m,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值