当前位置: 首页 > news >正文

dfn序的应用 (P1273 有线电视网题解)

P1273 有线电视网 - 洛谷

算法讲解079【必备】树型dp-下_哔哩哔哩_bilibili

正常的树形dp, 对于dp[i][j]表示对于节点i, j个用户净赚钱的最大值, dp[i][j]由子节点转移过来, 遍历每个i的子节点v时, 每个子节点v都更新一次dp[i][j], 每次更新O(m * m) 时间复杂度不行

利用dfn序的话, 从dfn序号从小到大开始遍历, 对于每个点i, i点选或者不选有,   dp[i][j] = max(dp[i - size(i)][j], dp[i - 1][j - 1]) 

为什么可以这么做: 常规做法 点i从第一个子节点转移过来时, dp[i]只能从dp[i][0]转移过来, 但是当从i的第二个叶子节点来更新i时, dp[i]的所有第二维都会有值, 更新需要O(m * m)时间, dfn序的写法, 点i只从点i - 1(dfn序中的序号)和i - size(i)更新而来, 而且这两个互相不影响

代码

#include<bits/stdc++.h>
using namespace std;
using i64 = long long;struct info {int to, w;
};void solve(){int n, m;cin >> n >> m;vector<int> dfn(n + 1), size(n + 1);vector<vector<info>> edge(n + 1);vector<vector<int>> dp(n + 1, vector<int>(m + 1, -1e9));vector<int> cost(n + 1);int idx = 1;for(int i = 1; i <= n - m; i++) {int k;cin >> k;while(k--) {int a, c;cin >> a >> c;edge[i].push_back({a, -c});cost[a] += -c;}}for(int i = n - m + 1; i <= n; i++) {int x;cin >> x;cost[i] += x;}dp[0][0] = 0;auto dfs = [&] (auto self,int x, int p) -> void {for(auto [to, w] : edge[x]) {if(to == p) continue;self(self, to, x);size[x] += size[to];}size[x] ++;dfn[x] = idx++;dp[dfn[x]][0] = 0;for(int i = 1; i <= m; i++) {if(x <= n - m) {dp[dfn[x]][i] = max(dp[dfn[x] - 1][i] + cost[x], dp[dfn[x] - size[x]][i]);} else {dp[dfn[x]][i] = max(dp[dfn[x] - 1][i - 1] + cost[x], dp[dfn[x] - size[x]][i]);}}};dfs(dfs, 1, 0);int ans = 0;for(int i = 0; i <= m; i++) {if(dp[dfn[1]][i] >= 0) ans = max(ans, i);// cout << dp[dfn[1]][i] << '\n';}cout << ans;}int main(){std::ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);int T = 1;//cin >> T;while(T--) solve();return 0;
}

http://www.lqws.cn/news/182557.html

相关文章:

  • 12.vite,webpack构建工具
  • 大模型与 NLP、Transformer 架构
  • 第四章 信息系统管理-4.1 管理方法
  • ✅ 常用 Java HTTP 客户端汇总及使用示例
  • 【计算机网络】HTTP
  • 香港科技大学(广州) | 生命科学与生物医学工程学域博士夏令营报名召集!
  • EditPlus中.nut文件高亮--stx配置文件解释
  • 代码安全规范1.1
  • Day46
  • Ubuntu 系统.sh脚本一键部署内网Java服务(组件使用docker镜像,宕机自启动)
  • win10+TensorRT+OpenCV+Qt+YOLOV8模型部署教程
  • LeetCode 2434.使用机器人打印字典序最小的字符串:贪心(栈)——清晰题解
  • 短视频矩阵SaaS系统:开源部署与核心功能架构指南
  • 华为仓颉语言初识:并发编程之同步机制(上)
  • 20250606-C#知识:匿名函数、Lambda表达式与闭包
  • Java适配器模式深度解析:无缝集成不兼容系统的艺术
  • [BIOS]VSCode zx-6000 编译问题
  • 【乐企板式文件】货物运输类发票,多页支持
  • 一套成熟的家装OMS
  • 智能制造数字孪生全要素交付一张网:智造中枢,孪生领航,共建智造生态共同体
  • 黑盒测试用例设计方法-全
  • 算法打卡16天
  • Axios请求超时重发机制
  • 5.2 HarmonyOS NEXT应用性能诊断与优化:工具链、启动速度与功耗管理实战
  • Kafka 入门指南与一键部署
  • vscode vue debug
  • CSS 定位:原理 + 场景 + 示例全解析
  • 前端技能包
  • Unity3D移动设备阴影优化方案
  • 鼠标的拖动效果