基于时间轴的动态规划
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
办公室主任
• 艾薇作为办公室的主任已经很长时间了,作为 一个部门主管,她不但要负责全部门的工作安 排、人员调动等组织工作,而且为了身先士卒, 她总给下属的感觉是“上司一刻不停地在工 作!”,所以这些下属们觉得头儿这么卖力, 大家也都很卖力、负责地工作,因此,近几年 来,艾薇负责的部门连续受到上级的表彰。看 着艾薇这么一刻不停地工作,大家有时不免要 劝阻她“要注意休息,身体是革命最大的本 钱!”。
算法优化
• 1、原算法的时间复杂度是?
• 2、是否有优化的余地?
• 3、排除重复是本题一个优化的方向
重复处理的分析
• 1、在某个阶段的时刻i枚举时,如果没有新的 任务刚好结束,当前时刻对应的最优解是不会 改变的,所以也不必去枚举已经产生的子问题, 然后来重复判断当前问题的最优解。 • 2、每到达一个新时刻,当前时刻如果有新任 务结束,也不必从头到尾重新枚举所有此前结 束的加工任务,而只需从上次结束的加工任务 后开始枚举即可。考虑到这点,我们需要实现 作个预处理,即按照加工任务结束时刻的先后 对输入的所有任务进行排序。
• 现在告诉你某天该部门所有必须完成的 具体工作的一些信息(每个具体工作以 开始时间的先后顺序给出),编程计算 艾薇最多能获得的空余时间总数。我们 假定艾薇从上班时刻到下班时刻之间都 不会离开办公室,她都会在工作岗位上。
• 输入文件director.in第一行包含二个用用空格分隔的 整数n和k(1<=n<=10 000,1<=k<=10 000),n表示 艾薇一天总的上班时间,单位分分钟,k表示该部 门必须在当天完成的具体工作总数。接下来共有k 行,每行有二个用空格分隔的整数s和t,表示该具 体工作从第s分钟的开头必须开始,持续时间分t分 钟,其中1<=s<=n,1<=s+t-1<=n。如果某具体工作 从s分钟开始,持续时间为t分钟,则该具体工作将 在第s+t-1分钟的末尾结束。
• 输入文件input.txt的第一行是一个整数n(不超 过100000),表示共有n个零件须加工。接下 来的n行中,每行有3个整数,分别表示每个零 件加工的时间要求,第一个表示开始时间,第 二个表示该零件加工的结束时间,第三个表示 加工该零件可以得到的加工费。 • 输出文件output.txt只包含一个整数,表示Tom 可以得到的最大加工费。结果输出到文件 output.txt
排除重复
• 1、每到一个新的时刻i,最优解ans[i]可 分哪些情况来分别产生? • 有新任务结束和没有新任务结束两种情 况。 • 2、如果有新任务结束,如何来判断是哪 些并分并处理? • 预处理时把每个时刻结束的任务编号保 存起来。
优化后的核心算法部分
• • • • • • • • • • • • 对所有任务按照结束时间进行从小到大排序; 计算最后一个任务的结束时刻m; ans[0]:=0; for i:=1 to m do begin ans[i]:=ans[i-1]; if 当前有任务j刚好结束(j可能不止一个) then begin if ans[i]<ans[a[j,1]]+b[j] then ans[i]:= ans[a[j,1]]+b[j]; end; end; write(ans(m));
输入输出样例
• • • • • • • 【输入样例】 3 1 3 10 4 6 20 2 5 25 【输出样例】 30
算法分析
6 19 7 5 8
4 1 5
4 2 17
21
3
4
1
2
3
4
5
6
7
8wk.baidu.com
9
10
11
12
13
14
• 用sum[i]表示到达时刻i时所能得到的最大收益,用a[j,1]表示任务 j的开始时间,a[j,2]表示任务j的结束时刻,b[j]表示任务j完成所 得的加工费。 • sum[i]=max{sum[k]]+b[j] | 1<=k<=a[j,1]<a[j,2]<=i}
•
但艾薇自己却知道,虽然她给人的感觉在“一刻不停地工 作”,但实际上她却在巧妙、科学地“偷懒”。因为她十分 清楚,作为主管,她绝对不能象下属那样整天埋头于琐碎、 具体的工作,她必须有足够的时间来统配、组织大家合作地 把部门工作搞好,而且这是一个优秀主管的首要工作,但她 也总不能因为这个原因而跟大家说“我要负责其他工作,所 有这些具体事务都你们做吧”。于是,她聪敏地想到了一个 “冠冕堂皇”的“偷懒”的工作安排方法,这个安排方案看 起来会使人觉得艾薇确实太身先士卒了,因为如果在某个时 刻,某项工作必须开始做了,而恰好艾薇手头现在没有具体 工作在做,那么这项工作必须由艾薇来完成;当然,如果现 在艾薇正在做一项未完成的具体工作,那么这项工作就由其 他下属完成;作为主管,有时当一批工作需要在某个时刻同 时开始时,艾薇负责分配这些具体工作由谁来完成,当然喽,
TOM的烦恼
• Tom是一个非常有创业精神的人,由于大学学 的是汽车制造专业,所以毕业后他用有限的资 金开了一家汽车零件加工厂,专门为汽车制造 商制造零件。由于资金有限,他只能先购买一 台加工机器。现在他却遇到了麻烦,多家汽车 制造商需要他加工一些不同零件(由于厂家和 零件不同,所以给的加工费也不同),而且不 同厂家对于不同零件的加工时间要求不同(有 些加工时间要求甚至是冲突的,但开始和结束 时间相同不算冲突)。
• Tom当然希望能把所有的零件都加工完, 以得到更多的加工费,但当一些零件的 加工时间要求有冲突时,在某个时间内 他只能选择某种零件加工(因为他只有 一台机器),为了赚得尽量多的加工费, Tom不知如何进行取舍,现在请你帮Tom 设计一个程序,合理选择部分(或全部) 零件进行加工,使得得到最大的加工费。
核心程序如下
• sum[0]:=0; for i:=1 to m do begin max:=0; for j:=1 to n do if a[j,2]<=i then if max<sum[a[j,1]]+b[j] then max:=sum[a[j,1]]+b[j]; sum[i]:=max; end; writeln(sum[m]);