【树形dp】P2014 [CTSC1997] 选课 题解

news2024/11/18 20:44:53

题目描述

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

思路

考虑构造虚根 0 0 0 ,将不用预选课的课程改为预选课为 0 0 0,好处是将原来的不联通的图变成一棵树。

在这里插入图片描述

d p i , j dp_{i,j} dpi,j 表示以 i i i 为根的子树取 j j j个点的最大收入,则有:

d p i , j = max ⁡ ( d p i , j , d p s o n 1 , n u m 1 + d p s o n 2 , n u m 2 ⋯ + d p s o n p , n u m p ) dp_{i,j}=\max(dp_{i,j},dp_{son_1,num_1} + dp_{son_2,num_2}\dots+dp_{son_p,num_p}) dpi,j=max(dpi,j,dpson1,num1+dpson2,num2+dpsonp,nump)

且有 s o n 1 … s o n p son_1\dots son_p son1sonp 均被 i i i 所指向,且 ∑ a = 1 p n u m a = j \sum_{a=1}^{p}{num_a} = j a=1pnuma=j

因此,考虑类似在树上做背包的方法。

对于每一个点,还是有:

还是记当前节点为 n o w now now,取其 i i i 个子节点(包括本身),有:

d p n o w , i = max ⁡ ( d p n o w , i , max ⁡ j = 0 i − 1 ( d p t o k , j + d p n o w , i − j ) ) dp_{now,i} = \max(dp_{now,i},\max_{j=0}^{i-1}{(dp_{to_k,j+dp_{now,i-j})})} dpnow,i=max(dpnow,i,j=0maxi1(dptok,j+dpnow,ij))

其中 t o k to_k tok 表示 i i i 的其中一个儿子。

代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m;
int head[1005],nex[2005],to[2005],cnt = 0;
int dp[1005][305];
void add(int x,int y) {
	nex[++cnt] = head[x];
	head[x] = cnt;
	to[cnt] = y;
} 
void dfs(int now,int fa) {
	for(int k = head[now];k;k = nex[k]) {
		dfs(to[k],now);
		for(int i = m;i >= 1;i--) {
			for(int j = 0;j < i;j++) {	
				dp[now][i] = max(dp[now][i],dp[now][i - j] + dp[to[k]][j]);
			}
			if(now == 0) dp[now][i] = max(dp[now][i],dp[to[k]][i]);
		}
	}
}
signed main() {
	scanf("%lld %lld",&n,&m);
	for(int i = 1;i <= n;i++ ) {
		int to;
		scanf("%lld %lld",&to,&dp[i][1]);
		add(to,i);
	}
	dfs(0,0);
	printf("%lld\n",dp[0][m]);
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2136379.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Leetcode 每日一题:Longest Increasing Path in a Matrix

写在前面&#xff1a; 今天我们继续看一道 图论和遍历 相关的题目。这道题目的背景是在一个矩阵当中找寻最长的递增数列长度。思路上非常好想&#xff0c;绝对和 DFS 相关&#xff0c;但是题目的优化要求非常高&#xff0c;对于语言和内存特性的考察特别丰富&#xff0c;如果是…

【Python报错已解决】ERROR: No matching distribution found for PIL

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 前言一、问题描述1.1 报错示例1.2 报错分析1.3 解决思路 二、解决方法2.1 方法一&#xff1a;安装Pillow2.2 步骤二&a…

CentOS安装Hadoop系列

安装Hadoop 1、安装SDK 2、Wget下载安装包到指定目录 3、选择hadoop的配置模式&#xff0c;单机模式&#xff0c;伪集群模式&#xff0c;集群模式 1、查找APACHE下载官网&#xff0c;搜索hadoop,进入目录&#xff0c;找到common目录&#xff0c;下载对应版本 国内&#xff0c;…

uniapp 原生插件开发 UI

前言&#xff1a; 在集成某些特定 原生SDK的时候&#xff0c;它本身是带UI控件的。当我们使用 uniapp 开发app的时候实是 可以使使用 nvue 页面&#xff0c;以 weex 的方式嵌入原生的UI控件。 我这边的场景是 接入连连app的支付&#xff0c;它有个自己的密码键盘 控件是原生的页…

好用的电脑录屏软件有哪些?推荐4款专业工具。

不同系统的电脑上面带有的录屏功能不一样&#xff0c;比如win10上面有Xbox game bar,Mac系统则用的是QuickTime Player&#xff0c;或者是使用快捷键“CommandShift5”。但更方便的&#xff0c;我自己认为是使用一些专业的录屏软件&#xff0c;他门的录制模式多&#xff0c;兼容…

python将这多个sheet页的数据合并在一起

有如下数据&#xff0c;需要将excel多个sheet页中的数据&#xff0c;合并在一起。 数据样例&#xff1a;&#x1f447; import pandas as pd import os# 读Excel文件 file_path D:/project/Excelimport/簿4.xlsx# 创建空的DataFrame用于存储合并后的数据 all_data pd.Data…

软件项目管理

1. 软件项目管理概述 1.1 软件项目管理 软件项目管理的提出是在20世纪70年代中期&#xff0c;当时美国国防部专门研究了软件开发不能按时提交、预算超支和质量达不到用户要求的原因&#xff0c;发现70%的项目是因为管理不善引起的&#xff0c;而非技术原因。 软件项目管理和…

9月17–20日Sui新加坡参会指南,期待与您相聚

&#x1f4e7;叮&#xff0c;您有一份Sui新加坡参会指南待领取&#xff5e; 随着新加坡Token2049大会的临近&#xff0c;我们为即将前往新加坡参会的朋友们准备了一份指南&#xff0c;帮助你快速了解Sui团队的活动安排&#xff0c;并与Sui团队来个线下面对面的交流。 9月17日…

解码消费医疗机构:如何通过全场景AI运营实现营销破局?

在当今的医美市场中&#xff0c;“流量困境”已成为众多消费医疗机构面临的严峻挑战。传播日益碎片化&#xff0c;各大机构对流量争夺也愈演愈烈&#xff0c;不少机构面临着新客获取难、老客户留存转化难、运营成本高昂等困境。 那么&#xff0c;面对这一挑战&#xff0c;消费…

Leetcode面试经典150题-79.搜索单词

题目比较简单&#xff0c;回溯最基础的题&#xff0c;记得除非覆盖&#xff0c;否则一定要恢复现场就行 解法都在代码里&#xff0c;不懂就留言或者私信 class Solution {public boolean exist(char[][] board, String word) {int m board.length; int n board[0].length;i…

Baumer工业相机堡盟工业相机如何通过BGAPI SDK设置相机的图像剪切(ROI)功能(C语言)

Baumer工业相机堡盟工业相机如何通过BGAPI SDK设置相机的图像剪切&#xff08;ROI&#xff09;功能&#xff08;C语言&#xff09; Baumer工业相机Baumer工业相机的图像剪切&#xff08;ROI&#xff09;功能的技术背景CameraExplorer如何使用图像剪切&#xff08;ROI&#xff0…

公司搬迁至外地:选择新办资质还是迁移资质?

当企业面临搬迁&#xff0c;尤其是跨区域搬迁时&#xff0c;资质管理成为企业运营策略中的一个关键议题。企业需要在新办资质和迁移资质之间做出选择&#xff0c;这关系到企业的合规性、市场竞争力和业务连续性。本文将探讨这两种选择的考量因素&#xff0c;以及如何根据企业的…

cityengine修改纹理创建模型

数据准备 1、建筑shp面数据 2、安装好cityengine软件 3、Arcgis(非必要) 效果 1、新建工程 路径不要放C盘下 2、复制规则文件和纹理 安装软件后,这些素材在电脑上能找到,默认位置是:C:\Users{计算机名}\Documents\CityEngine\Default Workspace\ESRI.lib,如果找不到…

售后质保卡小程序系统开发制作方案

售后质保卡小程序系统作为一种数字化解决方案&#xff0c;通过微信小程序&#xff0c;为顾客提供更加便捷、高效、环保的质保服务体验。售后质保卡系统是集质保信息查询、报修申请、服务进度跟踪、顾客反馈等功能于一体的质保卡小程序。 目标顾客 1. 终端顾客&#xff1a;直接…

昇思MindSpore AI框架MindFormers实践3:ChatGLM3-6B对一段文字进行提取

MindSpore和MindFormers安装参见&#xff1a;昇思AI框架实践1:安装MindSpoe和MindFormers_miniconda 安装mindspore-CSDN博客 使用了MindSpore2.2和MindFormers1.0 支持的模型&#xff1a; KeyError: "model must be in odict_keys([gpt2, gpt2_lora, gpt2_xl, gpt2_xl…

Linux:开源世界的璀璨明珠

一、Linux 概述 Linux 是一种自由和开放源代码的类 Unix 操作系统&#xff0c;诞生于 1991 年&#xff0c;由芬兰大学生 Linus Torvalds 开发。它的起源离不开 Unix 家族&#xff0c;1969 年肯・汤普森设计了早期 Unix 的源头&#xff0c;到 1973 年丹尼斯・里奇等人以 C 语言…

基于多种智能优化算法优化BP神经网络的数据回归预测

基于多种智能优化算法优化BP神经网络的数据回归预测&#xff0c;主要是指通过引入一些优化算法来改进传统的BP&#xff08;反向传播&#xff09;神经网络的训练过程&#xff0c;以提高其在回归预测任务中的性能。以下是这个过程的基本原理&#xff1a; 代码原理及流程 1. BP神…

Java的发展史与前景

&#x1f308;个人主页&#xff1a;Yui_ &#x1f308;Linux专栏&#xff1a;Linux &#x1f308;C语言笔记专栏&#xff1a;C语言笔记 &#x1f308;数据结构专栏&#xff1a;数据结构 &#x1f308;C专栏&#xff1a;C 文章目录 0. Java语言的发展史1.概述1.1 什么是Java1.2 …

k8s 中的 Service 简介

前言 k8s 集群中的每一个 Pod 都有自己的 IP 地址&#xff0c;那么是不是有 IP 了&#xff0c;访问起来就简单了呢&#xff0c;其实不然。 因为在 k8s 中 Pod 不是持久性的&#xff0c;摧毁重建将获得新的 IP&#xff0c;客户端通过会变更 IP 来访问显然不合理。另外 Pod 还经…

JavaScript --函数作用域变量的使用规则(局部和访问)

访问规则&#xff0c;就近原则 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"w…