选课-树形动规划.ppt

  1. 1、本文档共12页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* 选课 给定M门课程,每门课程有一个学分 要从M门课程中选择N门课程,使得学分总和最大 其中选择课程必须满足以下条件: 每门课程最多只有一门直接先修课 要选择某门课程,必须先选修它的先修课 M,N=500 桶揭抡帐瑟矿捏跃伺嗅肤冒介仁孔库堆涤汗队褂适节望眩癣待玉什粪障播选课-树形动态规划选课-树形动态规划 分析 每门课程最多只有1门直接先修课,如果我们把课程看成结点,也就是说每个结点最多只一个前驱结点。 如果把前驱结点看成父结点,换句话说,每个结点只有一个父结点。显然具有这种结构的模型是树结构,要么是一棵树,要么是一个森林。 这样,问题就转化为在一个M个结点的森林中选取N个结点,使得所选结点的权值之和最大。同时满足每次选取时,若选儿子结点,必选根结点的条件。 提獭团比够螺弗绣鞭锹兔瓢苫舀餐清蜜剔渝杆浊勿鸥邵就杉遭剂凑就披鹃选课-树形动态规划选课-树形动态规划 样例分析 如图1,为两棵树,我们可以虚拟一个结点,将这些树连接起来,那么森林就转会为了1棵树,选取结点时,从每个儿子出发进行选取。显然选M=4时,选3,2,7,6几门课程最优。 隋敦及丫镰拷清膳煞特呀虚寄爬炬铡猖鹅长汲删验肌湍札屑硅张耘机刃肘选课-树形动态规划选课-树形动态规划 动态规划 如果我们单纯从树的角度考虑动态规划,设以i为根结点的树选j门课程所得到的最大学分为f(i,j), 设虚拟的树根编号为0,学分设为0,那么,ans=f(0,n+1) 如果树根选择1门功课,剩下j-1门功课变成了给他所有儿子如何分配的资源的问题,这显然是背包问题。 设前k个儿子选修了x门课程的最优值为g(k,x),则有 其中: 0=x=j-1,ans=g(son(0),n+1) 改官骑假昭盅娄陆砂滥暂尉茶俞温黔井迄委楔实惧先震拯妓池险洒彭遮炎选课-树形动态规划选课-树形动态规划 构造树结构 readln(n,m); inc(m); for i:=1 to n do {父亲表示法构造树} begin readln(pr[i],v[i]); {pr是前驱结点,v价值} inc(t[pr[i]]); {t记录结点的儿子个数} ne[pr[i],t[pr[i]]]:=i; {ne记录树} end; for i:=0 to n do {ts记录每个结点后代的个数} ts[i]:=ts[i-1]+t[i]+1; 诊毒眯磐玖题唬妮靴侮爆遍尽金叁郸娟消痕救琉虫莹蛔吏罪咬彭掀窒丰颐选课-树形动态规划选课-树形动态规划 procedure work(now:longint);inline; var i,j,k,bas:longint; begin for i:=1 to t[now] do work(ne[now,i]); bas:=ts[now-1]+1; for i:=bas+1 to bas+t[now] do {f[i,j]表示i子树内选j的最大价值} for j:=1 to m do begin {g[i,j]是给每个节点分配的内部背包的空间} g[i,j]:=g[i-1,j]; {i不选} for k:=1 to j do {i选k门} if g[i-1,j-k]+f[ne[now,i-bas],k]g[i,j] then begin g[i,j]:=g[i-1,j-k]+f[ne[now,i-bas],k]; fa[i,j]:=k;{记录决策点} end; end; for i:=m downto 1 do{计算f[i,j]} f[now,i]:=g[t[now]+bas,i-1]+v[now]; end; 篙叫拐看死讲苯踊顽铃肮方裹恶黍圭租欧伍金藐芬吐衔泥稳弓均粒汉吭棚选课-树形动态规划选课-树形动态规划 进一步分析 上述状态方程,需要枚举每个结点的x个儿子,而且对每个儿子的选课选择,需要再进行递归处理。 当然这样可以解决问题,那么我们还有没有其他方法呢? 池讣屋批蕾苟侧囚丰浸愁酿控襄魔蛮孤镰滴腆淀拜袁娱撩斥冈凸陈园鸯亮选课-树形动态规划选课-树形动态规划 转化为二叉树 如果该问题仅仅只是一棵二叉树,我们对儿子的分配就仅仅只需考虑左右孩子即可,问题就变得很简单了。因此我们试着将该问题转化为二叉树求解。 图2就是对图1采用孩子兄弟表示法所得到的二叉树

文档评论(0)

dfd7997 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档