树形dp原理

简介: 笔记

树形DP


没有上司的舞会

状态表示

f[u][0] : 所有从以u为根的子树中选择,并且不选择这个点的方案


f[u][1]: 所有从以u为根的子树中选择,并且选择这个点的方案


状态计算

6.png

const int N = 6005;
vector<int>v[N]; //邻接表
int happy[N]; //快乐值
bool has_father[N]; //找到根节点
int f[N][2];
void dfs(int u) {
  f[u][1] = happy[u];
  for (int i = 0; i < v[u].size();++i) {
    int j = v[u][i]; //当前节点的子节点
    dfs(j); // 先递归 后计算
    f[u][0] += max(f[j][0], f[j][1]); // 状态转移
    f[u][1] += f[j][0]; // 状态转移
  }
}
int main() {
  int n;cin >> n;
  for (int i = 1; i <= n;++i)cin >> happy[i];
  for (int i = 1;i < n;++i) { //读入树
    int a, b;cin >> a >> b;
    v[b].push_back(a);
    has_father[a] = true;
  }
  int root = 1;
  while (has_father[root])++root; //找到根节点
  dfs(root);
  printf("%d\n", max(f[root][0], f[root][1]));
}
目录
相关文章
|
7月前
|
算法 测试技术 Android开发
LeetCode 周赛上分之旅 #45 精妙的 O(lgn) 扫描算法与树上 DP 问题
学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越抽象,它能覆盖的问题域就越广,理解难度也更复杂。在这个专栏里,小彭与你分享每场 LeetCode 周赛的解题报告,一起体会上分之旅。
37 2
LeetCode 周赛上分之旅 #45 精妙的 O(lgn) 扫描算法与树上 DP 问题
|
1月前
|
算法
动态规划之第 N 个泰波那契数/三步问题【leetCode】【算法】
动态规划之第 N 个泰波那契数/三步问题【leetCode】【算法】
|
2月前
|
监控 算法 测试技术
【动态规划】【树形dp】【C++算法】968监控二叉树
【动态规划】【树形dp】【C++算法】968监控二叉树
|
7月前
|
算法
贪心算法的思路和典型例题
贪心算法的思路和典型例题
|
8月前
|
人工智能 算法 机器人
【算法基础】深搜(下)
【算法基础】深搜(下)
65 0
|
8月前
|
算法 机器人 C语言
【算法基础】深搜(上)
【算法基础】深搜(上)
57 0
|
11月前
|
存储 人工智能
|
11月前
|
算法 索引
从三道经典的leetcode题掌握二分法
前言 二分法是典型的搜索算法,其主要运用于有序序列中寻找目标值。其思路非常简单,就是不断比较搜索区间的中间值与目标值,当中间值等于目标值则结束搜索,如果中间值大于目标值,则继续搜索左半区间,反之搜索右半区间。 总结下,二分法就是在搜索过程中不断地将搜索区间减半,直到搜索到目标值或者搜索区间为空集。
|
机器学习/深度学习 算法 C++
树形DP算法的实现
树形DP算法的实现
树形DP算法的实现
代码随想录刷题|贪心算法理论 LeetCode455.分发饼干 376. 摆动序列 53. 最大子序和
代码随想录刷题|贪心算法理论 LeetCode455.分发饼干 376. 摆动序列 53. 最大子序和
代码随想录刷题|贪心算法理论 LeetCode455.分发饼干 376. 摆动序列 53. 最大子序和