活动安排的最优解,一般是贪心算法的思路求取.每一次选择 相对于当前时间 最早结束的活动,得到的子序列是活动的一个最优安排,即在一段时间内安排的活动数最多.
设定命题
贪心算法执行到第k步,选择了k项活动 i1,i2,ik
则存在最优解A,就是所选的这k项的集合 A = {i1,i2,…ik}
意思就是,要证明我们所用的贪心算法,每一步都是最优解
设变量
设共有n项活动待安排,活动的开始时间分别是s1,s2,…sn
活动的结束时间分别是 f1,f2,…fn
将这n个活动按照最早结束时间排好序,也就是f1,f2,…fn从小到大排好序
排好序的n个活动设为S = {a1,a2,…an}
这个活动安排题目的最优解,即安排的活动数最多的子序列,设为A
一共需要选择x次得到最优解
数学归纳法
当算法执行到第k步的话,表示当前已经选择了k项活动.
当k=1时,我们需要证明最早结束的活动a1,一定被选中
此时任取最优解B(其实就刚刚选了一个活动),如果B中第一个活动不是a1,那么可以用a1,替换B中的第一个活动
替换过后的B’也是当前的最优解.所以无论第一个活动在不在B里,都能找到最优解A使得第一个活动一定在最优解A里
假设算法执行k次时,得到的是最优解
A = {i1,i2,…ik}
算法还没有执行完毕,A中剩下活动选自集合S’ = { i | i 属于S ,si>=fk}
S’中的元素肯定输入原集合,但是因为此时已经安排好了k个活动,如果要接着选,那么被选到的活动的开始时间一定是大于等于第k个活动的结束时间
假设从S’中选择的活动集合是C,那么按照我们的贪心算法C是S’的最优解
整体的最优解A = {i1,i2,…ik} U C
如果C不是最优解,D是最优解,说明D中包含的活动比的多
那么整体的最优解应该是 A = {i1,i2,…ik} U D
与A = {i1,i2,…ik} U C是最优解相矛盾
到此
我们在假设贪心算法执行k次,所选择的集合是最优解的条件下
推出 A = {i1,i2,…ik} U C
那么当算法执行k+1次时,即从S’中再选出一个元素 i(k+1) 时,根据上面的假设,我们知道 i(k+1) 一定是S’中开始时间最早的活动,而且C是S’的最优解,
所以{i1,i2,…ik,i(k+1)} U { C- i(k+1) }也是原问题的最优解.
总结
k=1时,一定会选最早开始的活动
假设 k = k时成立
也就是最优解 A = {i1,i2,…ik} U C
那么有 k = k + 1时
A = {i1,i2,…ik,i(k+1)} U { C- i(k+1) }
所以对于这道活动安排题,贪心算法所取得的就是最优解
这东西不像数学公式那样,有板有眼的
我自己理解的也不是很透彻
应该多分析分析就好了吧,毕竟小菜鸡不能变成北京烤鸭