题目链接

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

用前向星存图 把每个节点的子节点存起来

从0节点开始访问 dp[u][j] u->代表根节点 j->代表以u为起点选j个最大分数

然后进行动态规划

for(int i=head[u];i;i=e[i].next)//访问每一个叶子结点for(int j=m,v=e[i].to;j>0;j--) //规划选课容量for(int k=0;k<j;k++)  //从叶子结点里选k个与原来的j-k个结合 与dp[u][j]比较dp[u][j]=max(dp[u][j],dp[u][j-k]+dp[v][k]);

在这上面加一个

 for(int i=head[u];i;i=e[i].next) solve(e[i].to);先访问叶子结点

然后总的代码如下

#include<bits/stdc++.h>using namespace std;
map<int,int>mp;
const int maxn=305;
//bool number[maxn + 5];
int n,m;struct node{int next,to;
}e[maxn];
int cnt;
int dp[maxn][maxn];
int head[10000];
void add(int u,int v){e[++cnt]={head[u],v};head[u]=cnt;
}
void solve(int u){//cout<<u<<endl;for(int i=head[u];i;i=e[i].next) solve(e[i].to);for(int i=head[u];i;i=e[i].next)for(int j=m,v=e[i].to;j>0;j--)for(int k=0;k<j;k++) dp[u][j]=max(dp[u][j],dp[u][j-k]+dp[v][k]);
}
int main(){cin>>n>>m; ++m;for(int i=1;i<=n;++i){int p; cin>>p>>dp[i][1];add(p,i);}solve(0);cout<<dp[0][m];return 0;
}
 **G寄**

P2014 [CTSC1997] 选课(树形dp)相关推荐

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

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

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

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

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

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

  4. 动态规划报告(树形DP+概率DP

    动态规划报告 树形dp 树形 DP,即在树上进行的 DP.由于树固有的递归性质,树形 DP 一般都是递归进行的.一般需要在遍历树的同时维护所需的信息 以一道题目为例 2022CCPC桂林站G Grou ...

  5. 【树形DP】树形DP入门详解+例题剖析

    树形DP 树形DP准确的说是一种DP的思想,将DP建立在树状结构的基础上.整体的思路大致就是用树形的结构存储数据. 要学树形DP之前肯定是要先学会树和图的呀,至少先学会链式前向星,不会的话可以看一下我 ...

  6. 打卡第二天 树形DP初步

    1.P1352 没有上司的舞会 题目概述: 有n个人,除老板外每个人都有自己的上司k和快乐值l,但每个人都不能和自己的上司同时出现在舞会上,舞会的快乐值为所有到达舞会的人的快乐值总和,求其最大值. 题 ...

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

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

  8. 选课_ctsc1997_ssl1606_树形dp

    Description 大学里实行学分.每门课程都有一定的学分,学生只要选修了这门课并考核通过就能获得相应的学分.学生最后的学分是他选修的各门课的学分的总和. 每个学生都要选择规定数量的课程.其中有些 ...

  9. (P2014[CTSC1997])选课(树上背包)

    题目链接:[CTSC1997] 选课 - 洛谷 分析:这是一道树上背包的模板题,什么是树上背包呢?就是说物品之间有依赖关系,就比如说选a就必须要先选b,选b又必须要先选c,大概就是这个意思,类似于我们 ...

最新文章

  1. 【C++】C++11 STL算法(九):番外篇
  2. 《代码敲不队》第八次团队作业:Alpha冲刺 第二天
  3. php mysql study_phpStudy 升级 MySQL5.7
  4. HLG 1539 选课
  5. 四周有阴影_四周窄边全功能TypeC 飞利浦256P1FR评测
  6. Lambda表达式介绍
  7. Kubernetes之路 1 - Java应用资源限制的迷思
  8. IDEA快捷键及使用技巧
  9. 11. Java基础之继承
  10. ssl1761-城市问题【图论,最短路,Dijkstra】
  11. np.random.choice用法
  12. mysql 存储引擎版本_mysql不同版本和存储引擎选型的验证
  13. AbstractQueuedSynchronizer浅析——同步
  14. H264帧的分析sps pps
  15. 数据分析学习笔记—python函数、异常与处理
  16. C#基础概念面试题(更新中)
  17. 解决input输入中文时,拼音在输入框内会触发input事件的问题
  18. GUID(GPT)分区格式安装Win7系统激活工具
  19. webgl漫反射公式物理原理猜测
  20. @ 剑指offer(python)最小的k个数

热门文章

  1. java导入可信任证书
  2. 手撕IP核系列——Xilinx FIR IP核之一
  3. vscode使用rem、媒体查询@media(图文详解,代码展示)
  4. BF算法详解+代码实现
  5. C# 生成软件注册码
  6. c语言 逗号表达式的作用,关于c语言逗号表达式的运算规则知识点
  7. python练习题 054:电话号码
  8. 谷歌技术“三宝”之一的Google文件系统和Kosmos 文件系统
  9. 如何激励软件测试人员,软件测试团队的激励方法
  10. 基于Ubuntu和STM32分析全局变量、局部变量、堆、栈