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

自下而上的树形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.xdnf.cn/news/18949.html

相关文章:

  • 深度学习——卷积神经网络(PyTorch 实现 MNIST 手写数字识别案例)
  • pcl_案例2 叶片与根茎的分离
  • 机器视觉学习-day09-图像矫正
  • Day30 多线程编程 同步与互斥 任务队列调度
  • leetcode_73 矩阵置零
  • 【LLM】Transformer模型中的MoE层详解
  • vue布局
  • 架构设计——云原生与分布式系统架构
  • Android中设置RecyclerView滑动到指定条目位置
  • 搜维尔科技核心产品矩阵涵盖从硬件感知到软件渲染的全产品供应链
  • 万博智云联合华为云共建高度自动化的云容灾基线解决方案
  • 【Python开源环境】Anaconda/Miniconda
  • 【数据结构与算法】(LeetCode)141.环形链表 142.环形链表Ⅱ
  • 重置 Windows Server 2019 管理员账户密码
  • 深入理解QLabel:Qt中的文本与图像显示控件
  • 国产的服务器
  • 机器学习回顾(一)
  • Day16_【机器学习—KNN算法】
  • 小白入门:支持深度学习的视觉数据库管理系统
  • 解构与重构:“真人不露相,露相非真人” 的存在论新解 —— 论 “真在” 的行为表达本质
  • c++ 观察者模式 订阅发布架构
  • Visual Scope (Serial_Digital_Scope V2) “串口 + 虚拟示波器” 工具使用记录
  • JavaScript中的BOM,DOM和事件
  • Spring Boot 实战:接入 DeepSeek API 实现问卷文本优化
  • 底层音频编程的基本术语 PCM 和 Mixer
  • 数据分析学习笔记4:加州房价预测
  • 腕上智慧健康管家:华为WATCH 5与小艺的智美生活新范式
  • 音频转PCM
  • curl、python-requests、postman和jmeter的对应关系
  • AR培训系统:油气行业的安全与效率革新