题目描述:
在大学里的每个学生, 为了达到一定的学分, 必须从很多课程里选择一些课程来学习, 有些课程必须在某些课程之前学习
现给出n(n<=300)个课程的先修课和学分, 在这n门课中选择m(m<=300)门学习, 求能获得的最大学分
思路:
树状dp
某一课程的先修课和这门课之间在树上构成了一种父子关系, 可以将这些课组织成一棵树, 并将这颗多叉树转为二叉树(即记录这个结点的子结点以及下一个兄弟结点), 并构造一个虚拟结点0用来表示根结点
设d(i,j)为以i为根的子树, 选择j门课的最优解
则答案为d(son(0),m)
对于每个结点,枚举分配到兄弟和子结点的课程数
代码:
1 |
|