Description

  大学里实行学分。每门课程都有一定的学分,学生只要选修了这门课并考核通过就能获得相应的学分。学生最后的学分是他选修的各门课的学分的总和。

  每个学生都要选择规定数量的课程。其中有些课程可以直接选修,有些课程需要一定的基础知识,必须在选了其它的一些课程的基础上才能选修。例如,《数据结构》必须在选修了《高级语言程序设计》之后才能选修。我们称《高级语言程序设计》是《数据结构》的先修课。每门课的直接先修课最多只有一门。两门课也可能存在相同的先修课。为便于表述每门课都有一个课号,课号依次为1,2,3,……。下面举例说明

  上例中1是2的先修课,即如果要选修2,则1必定已被选过。同样,如果要选修3,那么1和2都一定已被选修过。

学生不可能学完大学所开设的所有课程,因此必须在入学时选定自己要学的课程。每个学生可选课程的总数是给定的。现在请你找出一种选课方案,使得你能得到学分最多,并且必须满足先修课优先的原则。假定课程之间不存在时间上的冲突。

Input

输入文件的第一行包括两个正整数M、N(中间用一个空格隔开)其中M表示待选课程总数(1≤M≤1000),N表示学生可以选的课程总数(1≤N≤M)。

以下M行每行代表一门课,课号依次为1,2……M。每行有两个数(用一个空格隔开),第一个数为这门课的先修课的课号(若不存在先修课则该项为0),第二个数为这门课的学分。学分是不超过10的正整数。

Output

输出文件第一行只有一个数,即实际所选课程的学分总数。以下N行每行有一个数,表示学生所选课程的课号。

Sample Input

7   4

2   2

0   1

0   4

2   1

7   1

7   6

2   2

Sample Output

13

思路:

乍一看像是拓扑排序,仔细看看发现带权,再想想应该属于树形dp。但是原题建树得出的是一颗多叉树,甚至可能是森林,所以需要转成二叉树。戳这里戳这里戳这里

状态转移方程:

F[i,j]表示节点x取y门课得最高学分,则

F[i,j]=max(f[i.l,k-1]+i.v+f[i.r,j-k]) k=0,1,..j

源代码/pas

type
binary=recordl,r:longint;
end;
varn,m:longint;t:array[-1..100]of binary;w:array[-1..100]of longint;f:array[-1..100,-1..100]of longint;
function max(x,y:longint):longint;
beginmax:=y;if x>y thenmax:=x;
end;
procedure init;
vari,j,x:longint;b:array[0..100]of longint;
beginreadln(n,m);fillchar(b,sizeof(b),0);for i:=0 to n dowith t[i] dobeginl:=-1;r:=-1;end;for i:=1 to n dobeginreadln(x,w[i]);if b[x]=0 thent[x].l:=ielset[b[x]].r:=i;b[x]:=i;end;for i:=-1 to n dofor j:=0 to m doif (i=-1)or(j=0) thenf[i,j]:=0elsef[i,j]:=-1;
end;
procedure dfs(i,j:Longint);
vark,max,temp:longint;
beginif f[i,j]>-1 then exit;dfs(t[i].r,j);max:=f[t[i].r,j];for k:=1 to j dobegindfs(t[i].l,k-1);dfs(t[i].r,j-k);temp:=f[t[i].l,k-1]+f[t[i].r,j-k]+w[i];if temp>max then max:=temp;end;f[i,j]:=max;
end;
begininit;dfs(t[0].l,m);writeln(f[t[0].l,m]);
end.

转载于:https://www.cnblogs.com/olahiuj/p/5781332.html

选课_ctsc1997_ssl1606_树形dp相关推荐

  1. 【每日DP】day 8、P2014 [CTSC1997]选课(树形DP(树形背包)模板)难度⭐⭐⭐

    P2014 [CTSC1997]选课 题意为选一门课前要看它是否有前提条件:即选了一门主课才能选 "副科",所以可以树形背包来做. 注意是不能用分组背包来做,因为这道题附件有很多个 ...

  2. P2014 [CTSC1997] 选课(树形dp)

    题目链接 1 有前驱 2 有权值 可以联想到 是个森林结构 0代表空 如果把0看成根节点的话 就成了一个树 我们可以增加一个课容量 然后把0加入选课 就避免了森林结构 用前向星存图 把每个节点的子节点 ...

  3. 洛谷2014 选课(树形DP)树形背包问题

    题目描述 在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习.现在有N门功课,每门课有个学分,每门课有一 ...

  4. 背包类树形DP 选课题解

    题目传送门; 我觉得题目给出0节点作为虚拟课程,也避免了我们要去想将若干个森林建成一棵树:将N个节点的森林建成了N+1条边的树: 其次,我们对这个题进行一个分析: 很容易想到F[x,t]表示以x为根的 ...

  5. [Luogu P2014]选课 (树形DP)

    题面 传送门:https://www.luogu.org/problemnew/show/P2014 Solution 这是一道十分经典的树形DP题,这种类型的树形DP有一种很普遍的解法. 首先,观察 ...

  6. 0x54. 动态规划 - 树形DP(习题详解 × 12)

    目录 0x54.1 树形DP Problem A. 没有上司的舞会 Problem B. 战略游戏 0x54.2 树上背包 Problem A. 选课 Problem B.[数据加强版]选课(树上背包 ...

  7. 树形dp技巧,多叉树转二叉树

    今天复习树形dp时发现一道比较古老的题,叫选课,是树形dp的一道基础题,也是多叉树转二叉树应用的模版题 多叉树转二叉树的应用非常广泛,因为如果一个节点的儿子太多,一个一个存下来不方便去查询,并且会增加 ...

  8. 树形$dp$学习笔记

    今天学习了树形\(dp\),一开始浏览各大\(blog\),发现都\(TM\)是题,连个入门的\(blog\)都没有,体验极差.所以我立志要写一篇可以让初学树形\(dp\)的童鞋快速入门. 树形\(d ...

  9. 树形dp瞎讲+树形dp基础题题解

    ---恢复内容开始--- 没错 咕了这么久(没有青青姐久 我又开始写博客了( ´▽`) 想了很久些什么(才没有想过呢 虽然被鄙视基础不好但还是走上了树形dp的不归路 那么 就来写写树形dp吧(dtx ...

最新文章

  1. java 3gpp转mp3_Android音频以及音频播放器开发实例
  2. 数据库服务器 之 PostgreSQL数据库的日常维护工作
  3. PTA基础编程题目集-6-9 统计个位数字
  4. new relic 官方简介
  5. 数据库分库分表(持续更新中)
  6. 第四章 数学知识【完结】
  7. Bootstrap 模态框插件Modal 的选项
  8. Redis学习---(10)Redis 集合(Set)
  9. Redis入门篇(安装与启动)
  10. android 4 动画,[Android]开发App,你得知道这些4——动画
  11. 机器人动力学与控制学习笔记(二)————机器人动力学建模
  12. mysql连接显示“message from server :“Host ‘XXXX‘ is not allowed to connect to this MySQL server“”
  13. 迅雷、旋风、快车的下载地址加密算法解析
  14. java watcher service_GitHub - sinix/watcher: watcher(守望者)提供java应用暴露监控/健康检查的能力。...
  15. oracle fnd global,Oracle EBS R12 - 利用fnd_conc_global.set_req_globals设置子请求的Parent Request ID...
  16. 相册服务器位置,如何将相册存放在云服务器
  17. 创建IRP的相关内容
  18. 初识Nginx四:nginx代理服务器配置缓存
  19. Freshman Here~
  20. 全球著名大学计算机视觉相关实验室

热门文章

  1. 数组的foreach方法和jQuery中的each方法
  2. Docker技术入门与实战
  3. “10%时间”:优点和缺点——敏捷海滩会议上Elizabeth Pope的报告
  4. ASP.NET Core 源码阅读笔记(1) ---Microsoft.Extensions.DependencyInjection
  5. 话说模式匹配(5) for表达式中的模式匹配
  6. easydialog中对js的修改
  7. 一个下载游戏封面的站点
  8. 悲观锁和乐观锁_浅谈数据库悲观锁和乐观锁
  9. Mysql梳理(单表查询)
  10. IDEA下maven工程找不到@Test