最优子序列问题

最优子序列问题

   问题描述:把一个包含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

这里补一张代码图:



posted @ 2015-11-07 10:09  __夜风  阅读(1171)  评论(0编辑  收藏  举报