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

自下而上的树形dp

最大独立集

 1.蓝桥舞会

link:1.蓝桥舞会 - 蓝桥云课

分析:

code

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const ll MAXN = 1e5 + 7;
ll hpy[MAXN], fa[MAXN], dp[MAXN][2];
vector<ll> sons[MAXN];void dfs(ll u, ll fa)
{for(ll son : sons[u]){dfs(son, u);dp[u][0] += max(dp[son][1], dp[son][0]);dp[u][1] += dp[son][0];}
}int main()
{ll n; cin>>n;for(int i = 1; i <= n; i++) cin>>hpy[i];// init dpfor(int i = 1; i <= n; i++) dp[i][1] = hpy[i];for(int i = 1; i <= n - 1; i++){ll u, v; cin>>u>>v;sons[v].push_back(u);fa[u] = v;}// find rootll root = 1;while(fa[root] != 0) root = fa[root];dfs(root, 0);ll ans = max(dp[root][0], dp[root][1]);cout<<ans<<endl;return 0;
}

最小点覆盖

例题:战略游戏

link:P2016 战略游戏 - 洛谷

分析:

code

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
using ll = long long;
const ll MAXN = 1507;
ll n, dp[MAXN][MAXN];
vector<ll> sons[MAXN];void dfs(ll root, ll fa)
{for (ll son : sons[root]){if (son == fa) continue;dfs(son, root);dp[root][0] += dp[son][1];dp[root][1] += min(dp[son][0], dp[son][1]);}
}int main()
{// inputcin >> n;for (int i = 0; i < n; i++){ll idx, k; cin >> idx >> k;for (int j = 1; j <= k; j++){ll s; cin >> s;sons[idx].push_back(s);sons[s].push_back(idx);}dp[idx][1] = 1;// init dp}// dfsdfs(0, -1);cout << min(dp[0][0], dp[0][1]) << endl;return 0;
}

最小支配集

例题:皇宫守卫

题目:U224284 [提高]皇宫看守 - 洛谷

分析:

code

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
using ll = long long;
const ll MAXN = 1507;
ll n, kk[MAXN], dp[MAXN][3], ind[MAXN];
vector<ll> g[MAXN];void dfs(ll root, ll fa)
{ll _min = 1e18;// dfsfor (ll son : g[root]){//if (son == fa) continue;dfs(son, root);dp[root][0] += min({ dp[son][0], dp[son][1], dp[son][2] });dp[root][1] += min(dp[son][0], dp[son][1]);dp[root][2] += dp[son][1];_min = min(_min, dp[son][0] - min(dp[son][0], dp[son][1]));}dp[root][0] += kk[root];dp[root][1] += _min;// 确保至少一个son是0状态(根节点被选中)// 当root为叶子节点时, min为极大值,代表dp[root][1]状态不可取;(叶子节点不可能满足1状态条件,在root子树中不被选中同时又被支配
}int main()
{// inputcin >> n;for (int i = 1; i <= n; i++){ll idx, k, m; cin >> idx >> k >> m; kk[idx] = k;for (int j = 1; j <= m; j++){ll r; cin >> r;g[idx].push_back(r);ind[r]++;//g[r].push_back(idx);}}ll root;for (int i = 1; i <= n; i++){if (ind[i] == 0){root = i;break;}}dfs(root, 0);cout << min(dp[root][0], dp[root][1]) << endl;return 0;
}

http://www.dtcms.com/a/355087.html

相关文章:

  • Servlet 注解:简化配置的完整指南
  • 隐语Kuscia正式发布 1.0.0 版本,实现支持 Hive 数据源,支持 envoy 日志进行异常分析等功能
  • hive on tez如果是2个大表union会写几次临时文件到hdfs目录,数据量如何计算
  • hive on tez为什么写表时,要写临时文件到hdfs目录
  • 最长连续序列,leetCode热题100,C++实现
  • 解读 AUTOSAR AP R24-11 Manifest 规范 —— 从部署到安全的全流程支撑
  • 可拖拽指令
  • Xray与XPOC工具对比分析
  • 让企业资产管理高效透明——深度解析固定资产管理系统的功能、优势与价值
  • HBase Compaction HFile 可见性和并发安全性分析
  • Docker-compose离线安装
  • 【Canvas与盾牌】“靡不有初,鲜克有终”黄竖条盾牌
  • [ICCV25]TRACE:用3D高斯直接学习物理参数,让AI“推演”未来场景
  • 微硕WINSOK高性能MOS管WSF80P04,助力充电宝效能与安全升级
  • 在IAR Embedded Workbench for Arm中实现Infineon TRAVEO™ T2G安全调试
  • 舆情监测系统有哪些功能
  • 省市区三级联动选择器-组件
  • C++ 方向 Web 自动化测试实战博客系统思路
  • mac系统本地部署Dify步骤梳理
  • 资产与设备管理数字化转型实践:企业降本增效的新引擎
  • 图书管理系统练习项目源码-前后端分离-【Java版】
  • Linux /proc/pid 探索
  • 【全开源】云贝餐饮V3独立版系统 v1.8.7+API接口开发文档+搭建教程
  • 从 Dockerfile 到 Kubernetes:现代化 PHP 应用配置管理进阶指南
  • 打造旅游实训新场景:旅游管理虚拟仿真实训室的运营与教学落地
  • 旅游管理新阵地:虚拟仿真实训室的功能设计与教学应用
  • Python 实现冒泡排序:从原理到代码
  • java去图片水印的方法
  • Redis 连接数爆炸:连接池配置错误踩坑记录
  • Runway Gen-2 深度技术解析:AI视频生成的范式变革