树的各种问题.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
三、树形动态规划 这是样例的解释图。我们思考一下的话可以设立这样一个数组f[p,k]即在p下选取k个节点获得的最大收益。直接在树上做也可,但是每个点的度都不同,我们需要特别开一个数组来纪录每个点的度以及儿子下标,使问题比较复杂,而且空间也要开很大。 于是我们想到把树改造下,改成二叉树是最好不过的了。于是就用左儿子右兄弟改造一翻……再思考一些状态转移…… 三、树形动态规划 我们思考动态转移方程。f[p,k]表示在这个节点中选k个节点的最大值,那么如果选这个节点,那么还可以在它的左儿子里选i=0~k-1个节点,对应的在它的右兄弟里选k-1-i个节点。如果不选这个节点,那么它儿子的节点都不能选,只能从它的右兄弟里选k个。所以我们得到这个状态转移方程: f[p,k]:=f[right[p],k]; f[p,k]:=max{f[left[p],i]+a[p]+f[right[p],k-1-i]} i=0~k-1 f[p,k]取上面两者的最大值。为了使问题更加简化,我们可以直接把f[right[p],k]赋为它的初始值。 而对于初始值,可以把每个节点取0个节点的值赋为0,把不存在的节点的值赋为零。 于是我们将见到本课件中差不多是第三段代码。 来插一下屏... Kudo:你到你是什么人…… 三、树形动态规划 procedure dp(p,k:longint); begin if p=0 then begin f[p,k]:=0; exit; end; {边界条件} if k=0 then begin f[p,k]:=0; exit; end; dp(right[p],k); ans:=f[right[p],k]; {不选节点p从右兄弟选k个} for i:=0 to k-1 do {选节点p的情况} begin dp(left[p],i); dp(right[p],k-i-1); ans:=max(ans,f[left[p],i]+a[p]+f[right[p],k-i-1]; end; f[p,k]:=ans; end; 再加上左儿子右兄弟的转换,我们就完成了对此题的求解。 三、树形动态规划 我们再来看今天的最后一题! TYVJP1052没有上司的舞会 Ural大学有N个职员,编号为1~N。他们有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司。每个职员有一个快乐指数。现在有个周年庆宴会,要求与会职员的快乐指数最大。但是,没有职员愿和直接上司一起与会。 输入格式 Input Format 第一行一个整数N。(1=N=6000) 接下来N行,第i+1行表示i号职员的快乐指数Ri。(-128=Ri=127) 接下来N-1行,每行输入一对整数L,K。表示K是L的直接上司。 最后一行输入0,0。 输出格式 Output Format 输出最大的快乐指数。 三、树形动态规划 输入样例: 7 1 1 1 1 1 1 1 1 3 2 3 6 4 7 4 4 5 3 5 0 0 输出样例: 5 三、树形动态规划 树上的DP比较容易想,所以我们先考虑在树上的。(就是说先不转二叉树……) 简述题意: 树上的每个点都有其权值,对每一个点,选了这个点就不能选它的儿子,求能得到的最大的权值。 三、树形动态规划 设数组f[p,0]表示选这个点,f[p,1]表示不选这个点。 初始化f[p,0]=0 f[p,1]=a[p](a[p]即为其价值) 对于每个点 f[p,1]:=max(f[p,1],f[p,1]+f[z,0]); f[p,0]:=max(f[p,0],f[p,0]+x); x:=max(f[z,1],f[z,0]); (z取p的所有儿子) 这种方法可以154ms AC 但是,这种方法有一个明显的bug…… 不要这么打击wo…… 三、树形动态规划 这个bug就是内存…… 这样做的话必须要开这样两个数组,就像是邻接表的存储…… v[1..6000] 表示每个点有多少儿子 g[1..6000,1..6000] 表示每个儿子的下标 而后面那个数组明显要爆的,抱着鄙视数据的心态,我开了g[1..6000,1..500],结果弱弱的数据果断让我过掉了…… 抱着学习的心态,我打开了dxh的代码……差距是十分明显的…… 在算法相同的情况下,dxh用了传说中的指针,不仅解决了内存,时间上也有些改进(虽说是常数上的优化) 三、树形动态规划

文档评论(0)

20010520 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档