最优子序列问题
最优子序列问题
问题描述:把一个包含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
这里补一张代码图: