树上背包dp

news2024/9/25 7:23:39

在这里插入图片描述
“我们终其一生不过是为了一个AC罢了”
软件安装
嗯…这个题又调了一个下午,不过俺的确对dp方程有了一些理解
这个题没啥难的,不过是这个转移方程不太好想,过于抽象了,之前一直不理解树上背包是啥,现在理解了,en…
就是说把 d p [ i ] [ j ] dp[i][j] dp[i][j]定义成为以 i i i为根节点,耗费 j j j,能得到的最大价值,这没啥难的了吧?还有一个问题就是我们在对当前这个 c u r cur cur d p dp dp的时候,一定要注意先搜一下他的子节点,这里面由于已经缩点了,并且他就是一棵树,也不用设置 v i s vis vis数组,比较简单,也就是遍历一次就搜一次: d f s ( v ) dfs(v) dfs(v)
接下来我们看这个怎么用子节点来更新这个父节点
就是说这个方向一定要弄明白:
当我们用 d p [ k ] dp[k] dp[k]更新 d p [ k − i ] dp[k-i] dp[ki]的时候,这个更新的方向就是:
《----------向左的
啥意思,就是右方向的数更新左方向的
那么我们循环中的遍历方向就得是 + + ++ ++,也就是向右走:
------------》
可能这里有点抽象,不要着急,我们来举个例子看看:
a 0 , a 1 , a 2 , . . . , a n a_{0},a_{1},a_{2},...,a_{n} a0,a1,a2,...,an
当我们用 a n a_{n} an更新前面的数时,假设更新 a 2 a_{2} a2,那么这个时候如果外循环是从 n n n向0走的话,当走到 a 2 a_{2} a2之后是不是要用新的 a 2 a_{2} a2更新 a 2 a_{2} a2左面的数?这是不对的,因为我们更新的目的是用旧状态更新新的状态,在 a n a_{n} an更新完 a 2 a_{2} a2之后, a 2 a_{2} a2已经是新状态了,你不能再用这个新状态去更新旧状态了,相反而应该用旧的 a 2 a_{2} a2更新,但是由于你的行进方向出错,旧的 a 2 a_{2} a2已经被你冲掉了,你还咋更新?
然后背包问题还有一个事情,额,就是这个怎么更新的问题,注意我们这里设置的 j j j是背包剩余的重量,你用子节点向父节点更新的时候,相当于往里面加物品,得用总重量把 j j j减下去

for (int k= 0;k<= m - cost[cur];k++)
		{
		    for(int i=m-k;i<=m;i++)
			{
				dp[cur][k-(m-i)] = max(dp[cur][k-(m-i)], dp[j][i] + dp[cur][k]);
			}
		}

我们里面你看那个 k − ( m − i ) k-(m-i) k(mi)的正负号,相当于是整体在向右前进,不要写那种 ( k − i ) (k-i) (ki)然后 k k k是向右走, i i i也是向右走
嗯…今天第一次用 m a r k d o w n markdown markdown写了一次看起来还可以的博客
具体体现在是 m a r k d o w n markdown markdown不是markdown
后记:若有不当欢迎指出~~
好了,贴一个ac代码:

#include<bits/stdc++.h>
using namespace std;
#define max(a,b) (a>b)?a:b
const int lengthn = 105;
const int lengthm = 505;
int weight[lengthn];
int money[lengthn];
int cost[lengthn];
int w[lengthn];
int degree[lengthn];
int dp[lengthn][lengthm];
vector<vector<int>> edge(lengthn);
vector<vector<int>> edget(lengthn);
int n, m;
int flag;
int dfn[lengthn];
int low[lengthn];
stack<int> s;
int inq[lengthn];
int color[lengthn];
int cnt = 1;
int res = 0;
void tarjan(int cur)
{
	dfn[cur] = cnt++;
	low[cur] = dfn[cur];
	s.push(cur);
	inq[cur] = 1;
	for (int j : edge[cur])
	{
		if (!dfn[j])
		{
			tarjan(j);
			low[cur] = min(low[cur], low[j]);
		}
		else if (inq[j])
		{
			low[cur] = min(low[cur], dfn[j]);
		}
	}
	if (low[cur] == dfn[cur])
	{
		res++;
		while (s.top() != cur)
		{
			color[s.top()] = res;
			inq[s.top()] = 0;
			s.pop();
		}
		color[cur] = res;
		inq[cur] = 0;
		s.pop();
	}
}
void dfs(int cur)
{
	for (int j = 0; j <= m - cost[cur]; j++)
	{
		dp[cur][j] = w[cur];
	}
	for (int j : edget[cur])
	{
		dfs(j);
		for (int k= 0;k<= m - cost[cur];k++)
		{
		    for(int i=m-k;i<=m;i++)
			{
				dp[cur][k-(m-i)] = max(dp[cur][k-(m-i)], dp[j][i] + dp[cur][k]);
			}
		}
	}
}
int main(void)
{
	scanf_s("%d%d", &n, &m);
	for (int i = 1; i <= n; i++)
	{
		scanf_s("%d", &weight[i]);
	}
	for (int i = 1; i <= n; i++)
	{
		scanf_s("%d", &money[i]);
	}
	for (int i = 1; i <= n; i++)
	{
		int a;
		scanf_s("%d", &a);
		if (i != a && a != 0)
		{
			edge[a].push_back(i);//加一个超级源点就可以了,这个题的超级源点正好是那个
		}
	}
	for (int i = 1; i <= n; i++)
	{
		if (!dfn[i])
			tarjan(i);
	}
	for (int i = 1; i <= n; i++)
	{
		for (int j : edge[i])
		{
			if (color[j] != color[i])
			{
				edget[color[i]].push_back(color[j]);
				degree[color[j]]++;
			}
		}
	}
	for (int i = 1; i <= n; i++)
	{
		cost[color[i]] += weight[i];
		w[color[i]] += money[i];
	}
	for (int i = 1; i <=res; i++)
	{
		if(!degree[i])
		edget[0].push_back(i);
	}
	//tarjan缩点
	dfs(0);
	int ans = *max_element(dp[0], dp[0] + m + 1);
	printf("%d", ans);
}

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

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

相关文章

Xftp 无法连接 Debian

Xftp 无法连接 Debian检查网络是否配置有问题检查是不是防火墙没有关闭首先检查主机防火墙检查Debian防火墙启动SSH服务检查网络是否配置有问题 发现主机和Debian在一个网段。说明配置没有问题。 检查是不是防火墙没有关闭 首先检查主机防火墙 检查Debian防火墙 显然都没有开…

并行多核体系结构基础知识

目录分类MIMD计算机分类并行编程并行编程模型共享存储并行模型针对LDS的并行编程存储层次结构缓存一致性和同步原语缓存一致性基础对同步的硬件支持存储一致性模型和缓存一致性解决方案存储一致性模型高级缓存一致性设计互连网络体系结构分布式操作系统SIMT体系结构分类 根据Fl…

MCE | 磁珠 VS 琼脂糖珠

琼脂糖珠 长久以来&#xff0c;多孔的琼脂糖珠 (也称琼脂糖树脂) 作为免疫沉淀实验中的固相支持物常用的材料。琼脂糖珠海绵状的结构 (直径 50-150 μm) 可以结合抗体 (继而结合靶蛋白)&#xff0c;它能够直接高效、快速结合抗体&#xff0c;而不需借助特殊的专业设备。 图 1.…

【.Net Core】上传文件-IFormFile

文章目录安全注意事项存储方案文件上传方案.NET Core Web APi FormData多文件上传&#xff0c;IFormFile强类型文件灵活绑定验证内容验证文件扩展名验证文件签名验证文件名安全大小验证使名称属性值与 POST 方法的参数名称匹配来源安全注意事项 向用户提供向服务器上传文件的功…

openfeign调用文件服务的文件上传接口报错:Current request is not a multipart request

今天在用Swagger测试项目中文件服务的文件上传接口时发现接口调用异常。 异常展示 笔者这里罗列下Swagger上的错误显示、文件服务的异常以及服务调用方的异常。 【Swagger的异常】 【服务调用方的控制台异常】 【文件服务的控制台异常】 代码展示 【服务调用方的Controller…

KMP算法(求解字符串匹配)

提示&#xff1a;可搭配B站比特大博哥视频学习&#xff1a;传送门 &#xff08;点击&#xff09; 目录 前言 图解 代码 前言 KMP算法是一种改进的字符串匹配算法&#xff0c;由D.E.Knuth&#xff0c;J.H.Morris和V.R.Pratt提出的&#xff0c;因此人们称它为克努特一莫里斯―…

如何实现办公自动化?

办公自动化&#xff08;OA&#xff09;允许数据在没有人工干预的情况下流动。由于人工操作被排除在外&#xff0c;所以没有人为错误的风险。如今&#xff0c;办公自动化已经发展成无数的自动化和电子工具&#xff0c;改变了人们的工作方式。 办公自动化的好处 企业或多或少依…

jar包的一些事儿

在咱们日常的搬砖过程中&#xff0c;只要你涉及到Java的项目&#xff0c;就不可避免地接触到jar包。而实际开发中&#xff0c;maven等项目管理工具为我们自动地管理jar包以及相关的依赖&#xff0c;让jar包的调用看起来如黑盒一般"密不透风"。今天&#xff0c;让我们…

做音视频开发要掌握哪些知识?

最近有读者留言&#xff0c;说“想转行音视频开发&#xff0c;怎么做”&#xff0c;正巧&#xff0c;前几天我还在某乎上&#xff0c;看到有人在问音视频的学习资料&#xff0c;还是个大一的学生。 想说一句&#xff1a;真有眼光。 如今这个时代&#xff0c;想赚钱&#xff0c;…

前端开发——HTML5新增加的表单属性

1.formactiom属性 对于<input type"submit">、<button type"submit"></button>、<input type"image">元素&#xff0c;都可以指定formcation属性&#xff0c;该属性可以提交到不同的URL。 代码如下&#xff1a; <f…

自动化平台测试开发方案(详解自动化平台开发)

目录&#xff1a;导读 前言 自动化平台开发方案自动化平台开发 功能需求 技术知识点 技术知识点如表所示 自动化平台开发技术栈如图所示。 开发时间计划 投资回报率可视化 后期优化计划 登录功能实现 退出功能实现 使用Django 内置用户认证退出函数logout。 权限功…

Word控件Spire.Doc 【图像形状】教程(4) 用 C# 中的文本替换 Word 中的图像

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下&#xff0c;轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具&#xff0c;专注于创建、编辑、转…

元宇宙|世界人工智能大会之元宇宙论坛:设计篇

Hello&#xff0c;大家好~ 这里是壹脑云科研圈&#xff0c;我是鲤鱼~ 世界人工智能大会&#xff08;WAIC&#xff09;由国家发展和改革委员会、工业和信息化部、科学技术部、国家互联网信息办公室、中国科学院、中国工程院、中国科学技术协会和上海市人民政府共同主办。 大会…

宝宝喝奶粉过敏怎么办?

为了确保喂养过程安全&#xff0c;我们仍然需要首先了解婴儿奶粉过敏的症状&#xff0c;母亲利用这些基本症状来判断婴儿是否对奶粉过敏&#xff0c;以便及时发现婴儿奶粉过敏&#xff0c;找到相应的策略。婴儿奶粉过敏婴儿奶粉过敏&#xff0c;是指婴儿喝配方奶粉后&#xff0…

【STL】string 类

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《吃透西嘎嘎》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;为什么要…

一道面试题:JVM老年代空间担保机制

面试问题 昨天面试的时候&#xff0c;面试官问的问题&#xff1a; 什么是老年代空间担保机制&#xff1f;担保的过程是什么&#xff1f;老年代空间担保机制是谁给谁担保&#xff1f;为什么要有老年代空间担保机制&#xff1f;或者说空间担保机制的目的是什么&#xff1f;如果…

APS高级排产可视化设备任务甘特图

甘特图是评价一个高级计划排程系统的最重要指标之一。一方面企业排程结果数据量规模 大&#xff0c;表格形式显示数据非常不直观&#xff0c;必须借助甘特图进行可视化显示。另一方面&#xff0c;在甘特图上面手动调整排程结果&#xff0c;反馈生产实绩&#xff0c;也可大大简化…

为什么要用 Tair 来服务低延时场景 - 从购物车升级说起

「购物车升级」是今年双十一的重要体验提升项目&#xff0c;体现了大淘宝技术人“用技术突破消费者和商家体验天花板”的态度。这是一种敢于不断重新自我审视&#xff0c;然后做出更好选择的存在主义态度。 「体验提升」通常表现在以前需要降级的功能不降级&#xff0c;以前不…

Web3中文|元宇宙购物的兴起

来源 | techrepublic 近半数消费者接受元宇宙购物 根据UserTesting[1]最近的一项调查&#xff0c;42%的消费者打算在今年的节日季中&#xff08;holiday season&#xff1a;从感恩节到“黑五”&#xff0c;再到圣诞与新年&#xff09;进行元宇宙购物&#xff0c;其中88%的消费…

激光雷达数据的25个重要应用介绍

激光雷达是以发射激光束探测目标的位置、速度等特征量的雷达系统。从工作原理上讲&#xff0c;与微波雷达没有根本的区别: 向目标发射探测信号(激光束), 然后将接收到的从目标反射回来的信号 (目标回波) 与发射信号进行比较, 作适当处理后,就可获得目标的有关信息, 如目标距离、…