JZOJ3418. 【NOIP动态规划专题】选课(2017.8DP&贪心专题)
2017-08-09 20:54
274 查看
Description
大学里实行学分。每门课程都有一定的学分,学生只要选修了这门课,并通过考核就能获得相应的学分。学生最后的学分是他各门课学分的总和。每个学生都要选择规定数量的课程。其中有些课程可以直接选修,有些课程需要一定的基础知识,必须在选了其他的一些课程的基础上才能选修。
例如,《剥皮术》就必须在选修了《屠龙术》后才能选修。
我们称《屠龙术》是《剥皮术》的先修课。
每门课的直接先修课最多之有一门。两门课也可能存在相同的先修课。
每门课都有一个课号,课号依次是1,2,3……。以下表为例说明。
课号 先修课号 学分
1 无 1
2 1 1
3 2 3
4 无 3
5 2 4
上表中1是2的先修课,即如果要选修2,则1必须已被选过。
同样,要选修3,那么1和2都一定被选修过。
每个学生可选的课程总数是一定的,请找出一种方案,使得到的总学分最多。
Input
第一行包括两个正整数M、N(中间一个空格),其中M表示总课程数(1<=M<=1000),N表示每个学生最多可选的课程总数。(1<=N<=M)。
以下M行每行代表一门课,课号依次是1,2,…,M。每行两个数,第一个数为这门课的直接先修课的课号(若不存在则为0),第二个数为该门课的学分。学分是不超过10的正整数。
测试数据保证学生能够选满N门课。
Output
第一行只有一个数,即最多可得的学分。
如果M<=99,则以下N行每行一个数,表示学生所选的课程的课号,课号按升序排列。
如果M>=100,则不必输出具体方案。
数据保证只有唯一的正确输出。
Sample Input
7 4
2 2
0 1
0 4
2 1
7 1
7 6
2 2
Sample Output
13
2
3
6
7
Data Constraint
1<=M<=1000
想法:
树形DP套背包(树形背包)Description
设f[i][j]为到了以i为根的子树,选了j门课的最大学分
设size[i]表示目前以i为根的子树的大小
y是x的儿子
然后其实这是两两之间的匹配,所以时间算是O(n^2)
但如果要选x(x>0)这个子树,就必须选x这个点,所以一开始先把size[x]定为0而不是1
到后面tree[x,i]=tree[x,i-1]+a[x]即可选x这个点
方案?设tree1[x,i,k]为以i为根的子树,选了j门课使学分最大,选的第k个
答案为f[0,m],方案快排即可
大学里实行学分。每门课程都有一定的学分,学生只要选修了这门课,并通过考核就能获得相应的学分。学生最后的学分是他各门课学分的总和。每个学生都要选择规定数量的课程。其中有些课程可以直接选修,有些课程需要一定的基础知识,必须在选了其他的一些课程的基础上才能选修。
例如,《剥皮术》就必须在选修了《屠龙术》后才能选修。
我们称《屠龙术》是《剥皮术》的先修课。
每门课的直接先修课最多之有一门。两门课也可能存在相同的先修课。
每门课都有一个课号,课号依次是1,2,3……。以下表为例说明。
课号 先修课号 学分
1 无 1
2 1 1
3 2 3
4 无 3
5 2 4
上表中1是2的先修课,即如果要选修2,则1必须已被选过。
同样,要选修3,那么1和2都一定被选修过。
每个学生可选的课程总数是一定的,请找出一种方案,使得到的总学分最多。
Input
第一行包括两个正整数M、N(中间一个空格),其中M表示总课程数(1<=M<=1000),N表示每个学生最多可选的课程总数。(1<=N<=M)。
以下M行每行代表一门课,课号依次是1,2,…,M。每行两个数,第一个数为这门课的直接先修课的课号(若不存在则为0),第二个数为该门课的学分。学分是不超过10的正整数。
测试数据保证学生能够选满N门课。
Output
第一行只有一个数,即最多可得的学分。
如果M<=99,则以下N行每行一个数,表示学生所选的课程的课号,课号按升序排列。
如果M>=100,则不必输出具体方案。
数据保证只有唯一的正确输出。
Sample Input
7 4
2 2
0 1
0 4
2 1
7 1
7 6
2 2
Sample Output
13
2
3
6
7
Data Constraint
1<=M<=1000
想法:
树形DP套背包(树形背包)Description
设f[i][j]为到了以i为根的子树,选了j门课的最大学分
设size[i]表示目前以i为根的子树的大小
y是x的儿子
for k:=size[x] downto 0 do begin for j:=1 to size[y] do tree[x,k+j]:=max(tree[x,k+j],tree[x,k]+tree[y,j]); end; size[x]:=size[x]+size[y];
然后其实这是两两之间的匹配,所以时间算是O(n^2)
但如果要选x(x>0)这个子树,就必须选x这个点,所以一开始先把size[x]定为0而不是1
到后面tree[x,i]=tree[x,i-1]+a[x]即可选x这个点
方案?设tree1[x,i,k]为以i为根的子树,选了j门课使学分最大,选的第k个
答案为f[0,m],方案快排即可
相关文章推荐
- JZOJ4726. 【NOIP2016提高A组模拟8.22】种花(2017.8DP&贪心专题)
- JZOJ 3418. 【NOIP动态规划专题】选课
- 【jzoj3418】【NOIP动态规划专题】【选课】【树型依赖动态规划】
- JZOJ5220. 【GDOI2018模拟7.10】C(2017.8DP&贪心专题)
- JZOJ1617. 【SCOI2005】互不侵犯 (2017.8DP&贪心专题)
- bzoj 3214: [Zjoi2013]丽洁体 贪心&动态规划
- 【NOIP动态规划专题】最大利润
- JZOJ 4.1 C组 【NOIP动态规划专题】电子眼
- JZOJ8.11(C组)【NOIP动态规划专题】采药2 (Standard IO)
- 2540. 【NOIP动态规划专题】采药2 (Standard IO)
- NOIP专题复习——专题二:动态规划基础
- jzoj P1029【NOIP动态规划专题】电子眼
- 【NOIP动态规划专题】采药2
- 【NOIP动态规划专题】采药2 (Standard IO)
- 高中OJ1771. 【NOIP动态规划专题】烽火传递
- JZOJsenior1168.【NOIP动态规划专题】合唱队形
- 2.24 --- 2.25 动态规划专题小测 及 NOIP 2008 模拟 总结
- [NOIP2013] 花匠&积木大赛 贪心水题
- 动态规划专题
- 动态规划初步-01背包问题&&一维数组(空间复杂度优化)