首页 > 其他分享 >【LuoGu】2014 选课——树上DP

【LuoGu】2014 选课——树上DP

时间:2023-09-09 20:33:08浏览次数:58  
标签:std 结点 选课 int LuoGu cnt leq 课程 DP

[CTSC1997] 选课

题目描述

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

输入格式

第一行有两个整数 \(N\) , \(M\) 用空格隔开。( \(1 \leq N \leq 300\) , \(1 \leq M \leq 300\) )

接下来的 \(N\) 行,第 \(I+1\) 行包含两个整数 $k_i $和 \(s_i\), \(k_i\) 表示第I门课的直接先修课,\(s_i\) 表示第I门课的学分。若 \(k_i=0\) 表示没有直接先修课(\(1 \leq {k_i} \leq N\) , \(1 \leq {s_i} \leq 20\))。

输出格式

只有一行,选 \(M\) 门课程的最大得分。

样例 #1

样例输入 #1

7  4
2  2
0  1
0  4
2  1
7  1
7  6
2  2

样例输出 #1

13

解决方案

树形DP

根据题意我们可以发现题目中给的图是一个森林,直接进行\(DP\)不太好处理。因此要使用一个技巧:超级结点
超级结点就是新建一个结点将所有连通块连接在一起使森林连接成一棵树。然后从超级结点出发就可以遍历整棵树了。
建立超级结点后就可以来考虑动态规划了。

设\(f[i][j]\)表示在以\(i\)为根结点的子树上选取\(j\)个结点所能获得的最大分数。考虑结点\(k \in i的子结点\),如果我们不从以\(k\)为根结点的子树上选结点的话,那么\(f[i][j]=f[i][j]\),如果我们从以\(k\)为根结点的子树上选择\(cnt\)个子结点的话,\(f[i][j]\)就由两部分组成:从子树\(k\)中选出的\(cnt\)个结点,以及从\(i\)的其他子树中选出来的\(j-k\)个结点,状态转移方程为\(f[i][j] = f[i][j - cnt] + f[k][cnt]\)。因此总的状态转移方程为$$f[i][j]=max_{k \in son[i]}(f[i][j], f[i][j-cnt] + f[k][cnt]), cnt \in [0, m]$$

#include<bits/stdc++.h>

const int N = 330;

int n, m;
std::vector<std::vector<int>> g(N);
int w[N];
int f[N][N];

void dfs(int u){
	for(auto v:g[u]){
		dfs(v);
		for(int j = m + 1; j >= 0; j -- ){
			for(int k = 0; k < j; k ++ ){
				f[u][j] = std::max(f[u][j], f[u][j - k] + f[v][k]);
			}
		}
	}
}

int main(){
	std::ios::sync_with_stdio(false);
	std::cin.tie(0);

	std::cin >> n >> m;

	for(int i = 1; i <= n; i ++ ){
		int k, s;
		std::cin >> k >> s;
		g[k].push_back(i);
		w[i] = s;
		f[i][1] = s;
	}

	dfs(0);

	std::cout << f[0][m + 1];

	return 0;
}

题解参考:https://www.cnblogs.com/fusiwei/p/13753292.html

标签:std,结点,选课,int,LuoGu,cnt,leq,课程,DP
From: https://www.cnblogs.com/yjx-7355608/p/17690107.html

相关文章

  • 什么是 SAP ABAP AMDP?
    SAPAMDP(ABAPManagedDatabaseProcedure)是SAP的一项先进技术,用于在SAPHANA数据库上执行高性能的数据库操作。它允许ABAP开发人员编写数据库过程,这些过程可以在数据库级别上执行,从而实现更快的数据处理和更高的性能。在本文中,我将详细解释SAPAMDP的概念、工作原理以及如何在ABA......
  • 10 UDP 聊天实现
    packageInternet;importjava.io.BufferedReader;importjava.io.InputStreamReader;importjava.net.DatagramPacket;importjava.net.DatagramSocket;importjava.net.InetSocketAddress;//UDP实现聊天,两边都是发信方,也是收信方publicclassTest10_UDP_Me{pub......
  • 9 UDP 消息发送
    没有客户端和服务端这一说法packageInternet;importjava.net.DatagramPacket;importjava.net.DatagramSocket;importjava.net.InetAddress;importjava.net.SocketException;//UDP:类似发短信//发送端publicclassTest09_UDP_User1{publicstaticvoidma......
  • Ubuntu通过终端命令下载时提示“dpkg --configure -a......"
    如果之前在下载东西时,中途取消或中断可能会出现这种情况。结果 解决办法:在终端输入sudodpkg--configure-a ......
  • UDP协议&&UDP广播通信
    UDP协议概念传输层主要的应用协议模型有,TCP,UDP两种。TCP协议占主导地位,绝大多数网络都是借助TCP协议完成数据传输,但UDP也是不了或缺的重要通信手段相较于TCP,UDP通信形式像发短信。不需要建立连接。只需要专心获取数据就可以,省去了三次握手,通信速度可以大大提高,伴随着通信的稳......
  • 状态压缩dp
    蒙德里安的梦想问题描述问题分析$f[i][j]=\displaystyle\sum_{0到1<<n-1中所有合法的k}(f[i-1][k])$$f[m][0]$的含义为前$m-1$列摆好,且从第$m-1$列伸出到第m列状态为$0$的方案数,显然这就是答案(原因见下图)$k$是否合法需要看$k$和$j$的关系,第一个条件表示第$i-2$列......
  • luogu P1419 题解
    题目链接description给定一个长度为\(n\)的序列(值域为\([-10^4,10^4]\))和正整数\(st,ed\)。求一个区间,使得其长度\(\in[st,ed]\)且平均值最大,输出平均值。\(1\leqn\leq10^5\)solution这里给出一个复杂度线性的做法。求出前缀和数组\(s\),答案相当于\(\max\limit......
  • live555做流媒体服务器时解决rtp over udp模式下, 客户端没有发送teardown时直接关闭
    在我们使用live555作为RTSP服务器时,客户端在rtpoverudp模式下,rtsp客户端没有发送teardown而直接断开连接时需要等待65秒才回调关闭的问题。分析问题在RTSPClientConnection中没有保存相应的session值,所以在RTSPClientConnection断开时,并没有删除相应的RTSPClientSession;解......
  • 构筑下一代数据中心互联的“超级高速公路”,中科驭数正式发布KPU FLEXFLOW®-2100R RDM
    2023服贸会期间,中科驭数重磅推出最新自研的高性能网络“利器”——KPUFLEXFLOW®-2100RRDMA加速DPU卡。这款产品的发布标志着中科驭数在高性能计算和数据中心领域的不断创新,旨在面向高速网络、高性能存储搭建起算力集群内部通信的"超级高速公路”,助力高性能计算领域创新。站在数......
  • 数位dp
    字面意思。恨妻不成7传送门前面的限制按照题意模拟即可,然后考虑维护平方和的常用手段:本来是\(\suma^2\),变成了\(\sum(a+x)^2=\suma^2+2ax+x^2=\suma^2+2x\suma+\sumx^2\),发现维护一下“和”与“个数”即可。完美数传送门首先有一个性质就是\(\prod[a_i|n]=[\t......