数组分段和最大值最小问题(最小m段和问题)
问题描述
给定n个整数组成的序列,现在要求将序列分割为m段,每段子序列中的数在原序列中连续排列。如何分割才能使这m段子序列的和的最大值达到最小?
清洁工:假设有n个房间,清洁每个房间耗时用一个数组表示,10、20、30、40、50、60、70、80、90,安排m个清洁工,将连续的房间分成m份,每部分耗时求和,其最大值为此种分法的总耗时。求最快的耗时是多少。例如3个清洁工的话,10 20 30 40 50 | 60 70 | 80 90,此时是最快的,耗时为170。
装桶:把数据按顺序装入桶中,m即是给定的桶数,问桶的容量至少应该为多少才能恰好把这些数装入m个桶中
思路
先考虑最简单的情况,假设有 \(1\) 个数,只有一个桶,\(m=1\):至少需要容量为该数的值;
如果 \(n\) 个数,只有一个桶,\(m=1\):至少需要容量为 \(n\) 个数之和;
如果 \(2\) 个数,两个桶,\(m=2\):至少需要容量为两数之间最大值
如果 \(t\) 个数,两个桶,\(m=2\) 呢?
我们将 \(t\) 个数划分为两份,随机选一个划分位置 \(k\)
10, 20, 30, 40, | 50, 60, 70, 80, 90就变成两部分: \(k\) 个数分到 1 个桶;\(t-k\) 个数分到一个桶
最少所需容量为 \(f(t,2) = min\{max[f(k,1),f(t-k,1)]\},1\leq k < t\),其中 \(f(t-k,1)\) 表示后 \(t-k\) 个数之和,表示为\(f(t-k,1) = f(t,1)-f(k,1)\)
现在考虑 \(n\) 个数,\(m\) 个桶:
我们同样将 \(n\) 个数划分为两份,即前 \(m-1\) 个桶和最后 \(1\) 个桶,随机选一个划分位置 \(k\):
\[f(n,m) = min\{max[f(k,m-1),f(n-k,1)]\},1\leq k < n \]