【洛谷P2014】选课【树形DP】【背包】

树形动态规划——# P2014 [CTSC1997] 选课 阅读详情

题目大意:

题目链接:https://www.luogu.org/problemnew/show/P2014
有 n n n门功课,一些功课有先修课。每门功课都有学分。求选出 m m m门功课能获得的最大学分。


思路:

树形DP+背包。
很明显,这道题肯定是设 f [ u ] [ j ] f[u][j] f[u][j]表示以 u u u为根的子树选出 j j j门课程学习能获得的最大学分。
那么对于 u u u的任意一棵子树 v v v,我们设它有 s s s个结点,那么我们就可以在这棵子树中选择任意 k ∈ [ 0 ∼ s ] k\in[0\sim s] k∈[0∼s]个结点来转移。
那么方程很明显就是
f [ u ] [ j ] = m a x ( f [ u ] [ j ] , f [ u ] [ j − k − 1 ] + f [ v ] [ k ] ) f[u][j]=max(f[u][j],f[u][j-k-1]+f[v][k]) f[u][j]=max(f[u][j],f[u][j−k−1]+f[v][k])
为什么 j − k j-k j−k之后还要减 1 1 1呢?
因为要选择 u u u的子树,那么 u u u是肯定得选的,所以在转移的时候可以忽略掉这一个结点。
那么很明显,最终答案就是 f [ 0 ] [ m ] f[0][m] f[0][m]。


代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 400
using namespace std;

int n,m,f[N][N],head[N],tot;

struct edge
{
	int next,to,s;
}e[N]; 

void add(int from,int to,int s)
{
	e[++tot].to=to;
	e[tot].s=s;
	e[tot].next=head[from];
	head[from]=tot;
}

int dp(int x)
{
	int sum=1;  //以x为跟的节点个数
	for (int i=head[x];~i;i=e[i].next)
	{
		int sonsum=dp(e[i].to);  //子树节点个数
		sum=sum+sonsum;
		for (int j=sum-1;j>=0;j--)  //背包,要降序
		 for (int k=0;k<sonsum;k++)
		  if (j-k>=1)
		   f[x][j]=max(f[x][j],f[x][j-k-1]+f[e[i].to][k]);
	}
	return sum;
}

int main()
{
	memset(head,-1,sizeof(head));
	scanf("%d%d",&n,&m);
	int x,y;
	for (int i=1;i<=n;i++)
	{
		scanf("%d%d",&x,&y);
		f[i][0]=y;
		add(x,i,y);
	}
	dp(0);
	printf("%d\n",f[0][m]);
	return 0;
}
选课解题报告(树型DP) 很详细的树型DP(选课) 初学者最好的帮助 立即下载

相关推荐

QCC5125/QCC5144----LDAC 44.1K 48K 96K 192K 输出

QCC5125/QCC5144----LDAC 44.1K 48K 96K 192K 输出。而且还不需要license限制。

Alex_886的博客 1971

树形DP——[CTSC1997]选课

门功课,每门课有个学分,每门课有一门或没有直接先修课(若课程 a 是课程 b 的先修课即只有学完了课程 a,才能学习课程 b)。一个学生要从这些课程里选择。在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习。门课程学习,问他能获得的最大学分是多少?行包含两个整数 $k_i $和。表示第I门课的直接先修课,表示第I门课的学分。表示没有直接先修课(

m0_60738889的博客 1566

DSP28335新手避坑指南:手把手教你用CCS6.2生成10KHz SPWM(附完整工程)

本文详细介绍了如何使用DSP28335开发板和CCS6.2环境生成10KHz SPWM波形的完整工程指南。从开发环境配置、ePWM模块设置到SPWM算法实现,特别针对新手常见问题提供了解决方案和调试技巧,帮助工程师快速掌握DSP28335的SPWM生成技术。

weixin_42522374的博客 182

[树形dp] 选课

学校实行学分制。每门的必修课都有固定的学分,同时还必须获得相应的选修课程学分。学校开设了NN300门的选修课程,每个学生可选课程的数量M是给定的。学生选修了这M门课并考核通过就能获得相应的学分。在选修课程中,有些课程可以直接选修,有些课程需要一定的基础知识,必须在选了其它的一些课程的基础上才能选修。例如《Frontpage》必须在选修了《Windows操作基础》之后才能选修。我们称《Windows操作基础》是《Frontpage》的先修课。每门课的直接先修课最多只有一门。

m0_64542522的博客 1282

华北理工大学以升实验班蓝桥杯选拔赛题解

文章目录华北理工大学以升实验班蓝桥杯选拔赛题解A:期末考试题目描述题目讲解代码B:月份题目描述题目讲解代码C:打饭题目描述题目讲解代码D : 正弦波信号题目描述题目讲解代码E : 亲爱的长方形题目描述题目讲解代码F:挖金子题目描述题目讲解代码G : 金金的游戏题目描述题目讲解代码H : 区间和题目描述题目讲解代码详细视频讲解请关注华北理工大学b站账号。 华北理工大学以升实验班蓝桥杯选拔赛题解 A:期末考试 题目描述 Description 期末考试过去许多天了,如今成绩都出来了,那么现在让我们对成绩我分个类

Qq1739206233的博客 1126

解决Keil uVision许可证管理中Unknown Product错误

嵌入式开发中,IDE工具的许可证管理是确保开发环境正常运行的关键环节。Keil uVision作为ARM架构的主流开发工具,其许可证系统采用加密验证机制,通过产品版本识别实现授权控制。当出现Unknown Product错误时,通常源于版本兼容性问题或区域发行版差异,这直接影响开发工具链的可用性。特别是在维护历史项目或使用中国特供版时,开发者常会遇到此类问题。通过分析许可证类型、调整安装配置或建立虚拟化开发环境等工程实践方案,可以有效解决这类授权验证故障,保障嵌入式项目的持续集成与交付效率。

weixin_33743248的博客 363

树形dp基础:选课

首先能发现不同的科目之间存在依赖关系,所以建树。然后题目说是没有先修课的科目会以0为根,那么就建一颗以0为根的树,向下延申。 考虑dp,首先是数组的意义,不难想到用dp【i】【j】来表示以i为根,选j门课能获得的最大学分。但是这里因为我们是以0作为根的,所以最后肯定是要输出dp【0】【m】,但是0它不是一门课,所以m此时其实是加了一个1(就是m++),因为0肯定是会被选上的。或者我们就干脆直接让全体都-1,那么dp【0】【m】中的m就还是一开始的m,那么初始化时就应该是让dp【i】【0】=num【i】(n

sophilex的博客 499

Unity学习笔记之【IK反向动力学操作】

反向动力学,简称IK。相较于正向动力学,反向动力学旨在子级对父级产生的影响。使用IK,可以实现根据目标位置或方向来计算并调整角色的关节(骨骼)链,以使角色的末端(如手臂、腿部等)达到预期的位置或取向。通过使用 Unity 的 IK 功能,你可以实现各种复杂的角色动画效果,如角色抓取、足部对齐、手臂跟随等。 2. 将所视的目标物体拖拽绑定 4. 实现效果如下 :移动角色时注释立方体 实现效果如下

m0_47351846的博客 2954

DP-选课(树形DP)

Description  在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习。现在有N门功课,每门课有个学分,每门课有一门或没有直接先修课(若课程a是课程b的先修课即只有学完了课程a,才能学习课程b)。一个学生要从这些课程里选择M门课程学习,问他能获得的最大学分是多少? Input  第一行有两个整数N...

代码屋-CODE HOUSE 2136

[系统安全] 四十七.恶意软件分析 (3)动态分析经典沙箱Cape的安装和基础用法详解

系统安全将更好地帮助初学者了解病毒逆向分析和系统安全。前文详细介绍恶意代码静态分析经典工具Capa的基础用法,以及批量提取静态特征和ATT&CK技战术,主要是从提取的静态特征Json文件中提取关键特征。这篇文章将详细讲解动态分析沙箱Cape,其是一个开源的自动恶意软件分析系统,通过自动运行和分析恶意软件,全面分析和提取恶意软件的关键特征。本文先介绍Cape沙箱的安装和基础用法,后续随着深入再分享。基础性文章,希望对您有帮助!

杨秀璋的专栏 6730

【100%通过率】华为OD机试真题 Java&Go 实现【水库蓄水问题】【2022.11 Q4 新题】

给定一个长度为 n 的整数数组height。数组的元素表示山的高度,选择两个元素作为水库的边界,求蓄水量的最大值并输出蓄水量最大时的边界下标(蓄水量相同时输出下标较近的)。

MISAYAONE的博客 1万+

【codevs 1378】选课(树形dp)

故友新交何患无知音,惟愿不负时光不负卿

reverie_mjp的博客 726

使用SIMD思想进行memcpy的优化

arm64平台的memcpy的性能优化,相比C库提升30~40%,SIMD优化思路

zhaoxin1989的博客 1万+

背包类树形DP-洛谷P2014 [CTSC1997]选课

背包类树形DP-洛谷P2014 [CTSC1997]选课背包类树形DP例题思路代码 注:本文章参考《算法竞赛 进阶指南》(李煜东2018年1月第一版P291~292),引用文本均摘自该书 背包类树形DP 又称树形有依赖的背包问题。实际上是背包和树形DP结合。除了以“节点编号”作为树形DP的阶段,通常我们也像线性DP一样,吧当前背包的“体积”作为第二维状态。在状态转移时,我们要处理的实际上就是一个分组背包问题。 另外,还可以按照“左儿子右兄弟”的方法,把多叉树转化为二叉树,再进行计算 例题 链接:http

weixin_46304837的博客 341

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

洛谷P2014 选课 背包类树形dp 个人理解

题目:https://www.luogu.org/problemnew/show/P2014 首先,根据题意我们能很清楚的想象出一棵树。(为没有先修课的所有课加上一个虚拟的父亲节点) 一共可以选m门课,我们需要在树中选m个节点,使得所有节点上的权值(学分)加起来最大,注意每个节点可以背选当且仅当其父节点背选。 这是背包类树形dp的入门题。 其实很容易意识到这应该跟动态规划有关,因为节点有限...

forOnward的博客 367

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

[洛谷-P2014] [CTSC1997] 选课(树形背包DP)

[洛谷-P2014] [CTSC1997] 选课(树形背包DP)

Turing_Sheep的博客 1074

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

洛谷 p2014 [CTSC2001] 选课 树形背包DP

巧妙转化

Loi_cgold 502

洛谷P2014 [CTSC1997]选课(树形dp+背包)

题目链接 前言:怎么这树形dp入门题都这么难QAQ 题目分析: 写了发网络流,挂了,看了看数据发现我以虚拟节点建立的模型成环了emmm然后难搞了。还是得树形dp。 首先是这个森林,为了方便我们先把他们汇聚到树上,用虚拟节点的形式。 我们定义dp[i][j][k]表示节点i 的前j个儿子中选择k个所能获得的最大分数。 emmm这里就很01背包了。 压缩一维变为dp[i][j] 表示在节点i,限度为j的情况下能获得的最大贡献。 dfs过程中先处理儿子节点。然后再对该根背包转移。背包总容量为M,物品的V不确定的

weixin_45948940的博客 668

洛谷 P2014 [CTSC1997] 选课(树形dp, 分组背包)

树形dp, 分组背包

qq_38232157的博客 318

[洛谷 P2014 CTSC1997] 选课 (树形dp 经典)

[洛谷 P2014 CTSC1997] 选课 题目链接 大致题意: 给定一棵含有 n 个结点的森林,且树上的每个点有一个权值 w 依赖限制:选择v点必须选择v的父亲节点u点 求选择m个点的最大权值和 解题思路: 如果是一棵树,就是选择包含根节点的联通块的最大权值和 因为是森林,意味着至少有一棵树,也就是至少有一个根节点 引用图论里的知识,建立超级源点的思路,题目中所有点编号全部大于等于1,建立一个超级根节点0,将森林中的每一棵树的根节点连向超级根节点,那么就变成了求包含超级根节点的联通块的最大权值和

qq_49494204的博客 608

luogu P2014 选课

luogu P2014 选课 42行代码或成此题最X题解? 一看:树形dp f[i][j]表示以i为根的子树选了j个课所获得的最大学分 等等,课可以重复选! 要用背包搞搞喽 每次枚举子节点 对每个子节点先进行树形dp 再对父节点进行背包 这里可以把0看成一个假根,可以不选 所以对于每个不是假根的节点,一定要选自己 怎么选? 先背包,背包好了后f[x][i]=f[x][i-1]+s[i] 完美~ s...

weixin_43872370的博客 333

关于树形背包DP的时间复杂度证明

摘要 本文介绍了洛谷P2014选课问题的树形DP解法。通过构建依赖关系树,使用动态规划计算每个子树选课的最优解,时间复杂度经优化可达O(n^2)。证明部分展示了通过分析子树大小相乘的关系,以及两点在LCA处贡献复杂度,推导出算法复杂度为平方级别。该解法利用DFS遍历树结构,运用分组背包思想,最终输出根节点在限定课程数下的最大收益。

zpy的博客 1541

寒假集训总结:树形背包 DP

表示在这里,前棵子树选了门课,能够获得的最大学分。那么,现在有一种解法(如下)。

lnx131112的博客 400

树形DP进阶:让动态规划在树上“生根发芽”

本文深入讲解了树形动态规划(DP)的两个进阶方向:树上背包和换根DP。树上背包通过在树上做分组背包来解决依赖性问题(如选课问题),而换根DP则通过两次DFS高效计算以每个节点为根时的最优解。文章从基础模型出发,结合经典例题和代码框架,详细阐述了状态设计、转移方程和复杂度分析。最后总结了树形DP的三个层次:基础递推、树上背包和换根DP,强调理解分组本质和两次扫描的关键作用。掌握这些方法能有效解决树结构上的复杂优化问题。

船漏了就会沉的博客 209

洛谷 P2014 选课

洛谷 P2014 选课 Description 在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习。现在有N门功课,每门课有个学分,每门课有一门或没有直接先修课(若课程a是课程b的先修课即只有学完了课程a,才能学习课程b)。一个学生要从这些课程里选择M门课程学习,问他能获得的最大学分是多少?...

aochongbi5356的博客 182

CTSC1997选课——之简单树形背包剖析

树形背包入门———— 写了一道树形背包题目,想了挺久的,把我的思路分享一下。 这里引用一道基础树形背包题目来配合讲解。 洛谷:P2014 CTSC1997选课 题意:在森林中每个点都有权值,选择M个点,使得总权值最大。(选择一个点,当且仅当它是根节点或者它的父节点被选择) 感觉对于我这种不太聪明的初学者很不友好,dp讲究一个寻找子问题,区间dp和线性dp一般直接根据题意找子问题在推出更大的问题。这...

m0_45699242的博客 392
上一篇: 【洛谷P1939】【模板】矩阵加速(数列)
下一篇: 【洛谷P1057】传球游戏【DP】
stoorz1023
博客等级 码龄9年 101粉丝 595原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值