由于每个技能最多只有 1 个直接前置技能,且依赖关系无环,所以所有技能会形成一片森林。
我们加入一个虚拟根节点 0,把所有没有前置技能的技能都连到 0 上,然后使用树形背包。
定义 dp[u][t] 表示:
在技能 u 的子树中,花费 t 小时,并且已经学习技能 u 时,能获得的最大战斗力。
你正在玩一款游戏,游戏中有一个技能树系统。每个技能都有:
你有有限的总学习时间 T ,需要在技能树中选择一条最优的学习路径,使得在时间限制内获得最大总战斗力。
第一行:两个整数 N 和 T
接下来 N 行:每行描述一个技能(各字段之间以空格分隔)
输出一个整数:在时间 T 内能获得的最大战斗力。
如果在时间 T 内无法完成任意一个技能(例如 T = 1 ,任意一个技能学习时间均大于 1 ),则输出 0 。
输入
2 1
1 2 15 0
2 4 20 0
输出
0
说明
学习技能 1 、 2 所需要的时间均大于总学习时间 1 ,无法完成任意技能的学习,因此输出 0 。
输入
4 8
1 3 25 0
2 4 30 0
3 5 40 1 1
4 2 20 1 2
输出
65
说明
最终得到的最大总战斗力为 65 。
By signing up a CodeFun2000 universal account, you can submit code and join discussions in all online judging services provided by us.