最优子序列问题

本文探讨了一种特殊的子序列划分问题,目标是最小化各子序列元素和的最大值。通过传统动态规划方法难以解决大规模数据集的问题,文章提出了一种二分查找结合扫描线算法的高效解决方案。

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

最优子序列问题

   问题描述:把一个包含n个正整数的序列划分成m个连续的子序列(每个正整数恰好属于一个序列)设第i个序列的各数之和为S(i),你的任务是让所有S(i)的最大值尽量小。例如序列1,2,3,2,5,4划分成3个序列的最优方案为1,2,3|2,5|4,其中S(1),S(2),S(3)分别为6,7,4,最大值为7;如果划分成1,2|3,2|5,4,则最大值为9,不如刚才的好。N<=10^6,所有数之和不超过10^9.


正常思路: 

   让所有S(i)的最大值值尽可能小,正常思维是一个序列,动态划分成m个子序列,然后找出m个子序列中的最大值,每次动态划分后,进行一次对比,直到找出最优的解。但是N的最大范围是10^6,动态划分肯定是不行的。

 

另外一种解决思路:

二分所有可行解,然后扫描一次原序列。

 

分析:

   因为对于每一种状态p,它必须满足的条件是如果Xi<=p,那么它为真,然后保存这个状态,之后找出最小的p即可,如果Xi>p,那么它为假,那么二分的时候,向右处理。

扫描原序列,即是找出满足题意的最大值即可,所以复杂度是O(n)

二分复杂度是log(M),所以求解复杂度是n*logM

这里补一张代码图:



转载于:https://www.cnblogs.com/yefengCrazy/p/5636650.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值