P1273 有线电视网 (树上分组背包)

[洛谷 P1273] 有线电视网 (树形分组背包) [洛谷 P1273] 有线电视网 题目链接 大致题意: n个节点,m个叶子节点,根节点为1号点,每一条边都有一个边权,代表花费,叶子节点具有点权,代表收益 问在总收益>=0的情况下,可以连通最多多少个叶子节点 如果我简化题意不是很清楚,请看原题意 解题思路: 这个题不是很好想,如果我们把每棵子树看作是一个分组,那么组内可以不选叶子节点,可以选一个,可以选两个… 也就是说,每一个组内最多只有一种决策,分组背包!! 分组背包的状态表示是前i个组中,选j个物品的最大收益 但是我们这是树形结构,要在加一 阅读详情

题解

dp[u][j]表示u的子树中选了j个终端的盈利。这里设v为u的子树。
状态转移:
dp[u][j]=max{dp[v][k+t]-cost},和分组背包类似,把子树v看成一个组,然后从子树v中选t个物品。

这里要注意的是树形dp其实自动省略了一维i,本质上是dp[i][u][j],前i颗子树中第u个结点有j个物品的盈利。这里用dfs从下往上更新可以省略掉第一维,所以这里对状态更新的时候需要逆序枚举j,原理跟一维01背包一样。

https://www.luogu.org/problemnew/show/P1273

#include <bits/stdc++.h>
using namespace std;
#define FOR0(a,b) for(int i = a; i < b; ++i)
#define FORE(a,b) for(int i = a; i <= b; ++i)
typedef long long ll;
typedef pair<int,int> pii;
const int INF = 0x3f3f3f3f;
const int maxn = 3000+5;
int n,m;
vector<pii> G[maxn];
int cost[maxn], dp[maxn][maxn], sum[maxn];
int tmp[maxn];
void add(int u, int v, int w) {
	G[u].push_back(make_pair(v,w));
}

void dfs(int u, int fa) {
	if(u > n-m) sum[u] = 1;
	for(int i = 0; i < G[u].size(); ++i) {
		int v = G[u][i].first;
		if(v == fa) continue;
		dfs(v,u);
		sum[u] += sum[v];

	}
	if(u > n-m)
		dp[u][1] = cost[u];
	else {

		int t = 0;
		for(int i = 0; i < G[u].size(); ++i) {
			int v = G[u][i].first;
			if(v == fa) continue;
			t += sum[v];
			//for(int j = 0; j <= t; ++j) tmp[j] = dp[u][j];
		    for(int j = t; j >= 0; --j) {
		    	for(int k = 0; k <= j; ++k) {
		    		dp[u][j] = max(dp[u][j],dp[u][j-k]+dp[v][k]-G[u][i].second);

		    	}
		    	// cout << u <<" " << j <<" " << dp[u][j] << endl;
		    }
		}
	}
}
int main() {
	memset(dp, -INF, sizeof dp);
	scanf("%d%d", &n, &m);
	for(int i = 1; i <= n; ++i) dp[i][0] = 0;
	for(int i = 1; i <= n-m; ++i) {
		int k;
		scanf("%d", &k);
		int v,w;
		for(int j = 0; j < k; ++j) {
			scanf("%d%d", &v, &w);
			add(i,v,w);
		}
	}
	for(int j = n-m+1; j <= n; ++j) 
		scanf("%d", &cost[j]);
	dfs(1,-1);
	int j;
	for(j = m; j >= 0; --j) {
		if(dp[1][j] >= 0) break;
	}
	cout << j << endl;
	return 0;
}
洛谷 P1273 有线电视网 P1273 有线电视网 //ans[i][j]表示第i个结点以下共j个用户观看时最大的赚钱量 //(仍然没有想到)ans[u][i]=max{ans[u][i-j]+ans[v][j]-w} //具体解释: /* ans[i][j][k]表示第i个结点以下前k个子结点中有j个用户观看时最大的赚钱量 ye[v]为v及以下叶节点数量 则对于边(u,v,w),ans[i][j][k]=max{ans 阅读详情

相关推荐

P1273 有线电视网(树形dp + 背包问题)

题目描述 某收费有线电视网计划转播一场重要的足球比赛。他们的转播网和用户终端构成一棵树状结构,这棵树的根结点位于足球比赛的现场,树叶为各个用户终端,其他中转站为该树的内部节点。 从转播站到转播站以及从转播站到所有用户终端的信号传输费用都是已知的,一场转播的总费用等于传输信号的费用总和。 现在每个用户都准备了一笔费用想观看这场精彩的足球比赛,有线电视网有权决定给哪些用户提供信号而不给哪些用户提供信号。 写一个程序找出一个方案使得有线电视网在不亏本的情况下使观看转播的用户尽可能多。 输入格式 输入文件的第一行包

five_east_west的博客 682

[洛谷-P1273]有线电视网(树形DP + 分组背包DP)

[洛谷-P1273]有线电视网(树形DP + 分组背包DP)

Turing_Sheep的博客 686

深入理解Linux 内核追踪机制

Linux 存在众多 tracing tools,比如 ftrace、perf,他们可用于内核的调试、提高内核的可观测性。众多的工具也意味着繁杂的概念,诸如 tracepoint、trace events、kprobe、eBPF 等,甚至让人搞不清楚他们到底是干什么的。本文尝试理清这些概念。

youzhangjing_的博客 1730

P1273 有线电视网(树上背包)

P1273有线电视网https://www.luogu.com.cn/problem/P1273 很好的一题 #include <cstdio> #include <cstring> #include <string> #include <vector> #include <cmath> #include <queue> using namespace std; const int MAXN=1e6+10; using ll=..

Ghostttttttiii的博客 414

下水管道损坏检测数据集总结

下水管道损坏检测数据集包含 6708 张图像,为下水管道损坏情况的检测提供了丰富的数据基础。该数据集提供了 YOLO 和 VOC 两种常见的标注方式,方便不同需求的使用者进行模型训练和研究。

crz1336768325的博客 868

告别LM2596!用LM5175打造400W自动升降压数控电源(附完整电路图与代码)

本文详细介绍了如何利用LM5175芯片设计400W自动升降压数控电源,替代传统的LM2596方案。通过四开关Buck-Boost拓扑结构,LM5175实现了高达98%的转换效率和400W大功率输出,支持无缝升降压切换。文章涵盖芯片选型、电路设计、PCB布局及STM32数控实现,为工程师提供完整的实践指南。

weixin_27032989的博客 598

P1273 有线电视网-树上DP之树上分组背包

原题链接有线电视网 - 洛谷 本题难度不亚于提高组,被评为普及应该是误评了。要对树型递归结构,链式前向星,和动态规划以及背包压维有着比较深的了解。如果以上知识不是太了解,可以先各刷五六道入门 树上分组背包常用格式就是dp[i][j]代表了i节点为根节点,容量为j时的最大价值。虽然是二维,但它是被三维压缩过来的。 我们设dp[i][u][j]表示以u为根的子树,仅用前i个儿子,满足j体积时取得最大价值, 那么dp[i][u][j]=max(dp[i-1][u][j-k]+dp[full_son_s

jisuanji2606414的博客 352

泰山派RK3576开发板部署Qwen3-VL-4B多模态模型实战指南:从模型转换到板端推理全流程

本文提供了在泰山派RK3576开发板上部署阿里Qwen3-VL-4B多模态模型的完整实战指南。详细介绍了从环境准备、模型转换(包括视觉模型转换为.rknn格式和语言模型转换为.rkllm格式)、交叉编译到板端推理的全流程,重点讲解了如何利用RK3576的NPU进行硬件加速,实现高效的边缘AI应用。

weixin_30356433的博客 257

P1273 有线电视网(树上分组背包)

树上分组背包

m0_63230242的博客 203

Simulink实战:5步搞定固定翼飞行器六自由度动力学建模(附模型下载)

本文提供了一份详细的Simulink实战指南,通过5个核心步骤手把手教你构建固定翼飞行器的六自由度动力学模型。内容涵盖从顶层架构设计、核心方程手动实现,到模型集成、测试调试及进阶优化的完整流程,旨在帮助航空航天学生和工程师将抽象理论转化为可运行的仿真模型,并附有模型下载。

perl8的博客 634

RK3568适配MIPI屏幕触摸,触摸延时很大

我用的是系统,接了一个,设备树已经正确配置,evtest测试坐标值和触摸位置都是准确的。但是出现了一个:我在屏幕上点一下,要等大约 2 秒才能在evtest里看到坐标事件打印。这种现象在 Goodix 系列触摸驱动里比较少见,一般意味着。

小灰灰的博客 1363

洛谷P1273 有线电视网 树上分组背包DP

P1273 有线电视网 )逼着自己写DP 题意:在一棵树上选出最多的叶子节点,使得叶子节点的值 减去 各个叶子节点到根节点的消耗 >= 0; 思路:   树上分组背包DP,设dp[u][k] 表示 到以u节点为根节点选k个叶子能得到的最大值。则可得到状态转移方程,   dp[u][k] = max(dp[u][k], dp[u][k-t] + dp[v][t] - cost),其中...

weixin_30360497的博客 118

智慧城市中的CV:交通流量监控与行人检测

智慧城市中的CV:交通流量监控与行人检测 ,人工智能,计算机视觉,大模型,AI,计算机视觉作为人工智能的重要分支,通过分析和理解图像或视频数据,为智慧城市提供了强大的感知能力。在交通管理领域,计算机视觉技术可实现交通流量监控、行人检测、违章行为识别等功能,助力构建高效、安全、绿色的城市交通系统。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 5万+

【题解】洛谷P1273 有线电视网(树上分组背包)

次元传送门:洛谷P1273 思路 一开始想的是普通树形DP 但是好像实现不大好 观摩了一下题解 是树上分组背包 设f[i][j]为以i为根的子树中取j个客户得到的总价值 我们可以以i为根有j组 在每一组中分别又取1个,2个,3个......n个客户 化为背包思想即 j为一共有j组 背包容量为每组的客户数总和 把该节点的每个儿子看成一组 每组中的元素为选一个,选两个...选...

193

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

洛谷P1273 有线电视网 【树上分组背包】

题目描述 某收费有线电视网计划转播一场重要的足球比赛。他们的转播网和用户终端构成一棵树状结构,这棵树的根结点位于足球比赛的现场,树叶为各个用户终端,其他中转站为该树的内部节点。 从转播站到转播站以及从转播站到所有用户终端的信号传输费用都是已知的,一场转播的总费用等于传输信号的费用总和。 现在每个用户都准备了一笔费用想观看这场精彩的足球比赛,有线电视网有权决定给哪些用户提供信号而不

Mychael的无声乐章 289

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

每日一题 P1273 有线电视网 树上分组背包

每日一题 P1273 有线电视网 树上分组背包 蓝色题,挣扎了一下写出来了 dp[i][j]表示i节点选择j个用户的收益最大值 最后求一下根节点收益不小于0的最大用户数量即可 #include <bits/stdc++.h> #define MAXN 600005 #define int long long #define endl "\n" using namespace std; struct EDGE { int to,next,w; }edge[MAXN]; int head[M

GreyKa的博客 167

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

树上dp+分组背包类问题

今天也是无意间看到了一个树上dp+分组背包类的问题,有些难度的,不好想的嘞,话不多说直接看题。

2301_80475191的博客 4205

洛谷P1273 有线电视网 (树上分组背包)

洛谷P1273 有线电视网 题目描述 某收费有线电视网计划转播一场重要的足球比赛。他们的转播网和用户终端构成一棵树状结构,这棵树的根结点位于足球比赛的现场,树叶为各个用户终端,其他中转站为该树的内部节点。 从转播站到转播站以及从转播站到所有用户终端的信号传输费用都是已知的,一场转播的总费用等于传输信号的费用总和。 现在每个用户都准备了一笔费用想观看这场精彩的足球比赛,有线电视网有权决定...

weixin_30537391的博客 135

洛谷 P1273 有线电视网 && caioj 1109 树形动态规划(TreeDP)4:比赛转播(树上分组背包总结)

从这篇博客往前到二叉苹果树都可以用分组背包做 这依赖性的问题,都可以用于这道题类似的方法来做 表示以i为根的树中取j个节点所能得的最大价值 那么每一个子树可以看成一个组,每个组里面取一个节点,两个节点,三个节点就是三个不同的物品 对于这道题,有 我们来类比一下普通分组背包的转移方程 这里的k表示第几组,而在树上就直接用i表示,因为i已经包含它的子树的信息了 然后 相当于, 后面的...

自强不息 厚德载物 250

洛谷 P1273 有线电视网 && caioj 1109 树形动态规划(TreeDP)4:比赛转播(树上分组背包总结)...

从这篇博客往前到二叉苹果树都可以用分组背包做 这依赖性的问题,都可以用于这道题类似的方法来做 表示以i为根的树中取j个节点所能得的最大价值 那么每一个子树可以看成一个组,每个组里面取一个节点,两个节点,三个节点就是三个不同的物品 对于这道题,有 我们来类比一下普通分组背包的转移方程 这里的k表示第几组,而在树上就直接用i表示,因为i已经包含它的子树...

weixin_34355881的博客 143

有线电视网(洛谷-P1273)

这是本题最容易踩坑的地方,很多人习惯性地把 DP 数组全初始化为 0,在这道题里会导致严重的后果。定义 dp[u][j]:表示以 u 为根的子树中,恰好选择 j 个用户所能获得的最大利润。树上背包问题,代码框架非常固定。真正有难度的,是对物理意义的理解dp初始化是否淘汰了幽灵数据?内层循环k是否精准处理了“选与不选”产生的代价差异?

布心老混子 所有代码均老混子本人远古手搓 易错点均为学生真实场景 博客文章部分借助ai生成 568

树上分组背包 洛谷 P1273 有线电视网

洛谷 P1273 有线电视网 树上分组背包 即在树上做背包问题 对每棵子树做背包,再用子树的状态递推父亲的状态 第一次做树上背包,所以定义状态的时候想了很久 首先,节点号作为一个状态,同时为了实现状态转移第二个状态为用户数量一开始想到费用上去了 i表示节点号,x表示选取用户数,dp[i][x]表示最高费用 状态转移方程 i:节点 x:该节点已保证用户数 ...

qcwlmqy的博客 183
上一篇: 后缀数组各个变量含义
下一篇: 奇怪的报数问题(线段树,类似于划分树)
Link_Ray
博客等级 码龄9年 44粉丝 156原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值