树形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]));
}
目录
相关文章
|
算法
带你读《图解算法小抄》十三、字典树(2)
带你读《图解算法小抄》十三、字典树(2)
|
9月前
|
存储 算法
【优选算法专栏】专题十六:BFS解决最短路问题---前言
【优选算法专栏】专题十六:BFS解决最短路问题---前言
76 1
|
9月前
|
算法
【优选算法专栏】专题十八:BFS解决拓扑排序--前言
【优选算法专栏】专题十八:BFS解决拓扑排序--前言
65 1
|
8月前
|
算法 搜索推荐 测试技术
力扣经典150题解析之二十九:三数之和
力扣经典150题解析之二十九:三数之和
59 0
|
8月前
|
算法 索引
力扣经典150题第二十六题:判断子序列
力扣经典150题第二十六题:判断子序列
37 0
|
存储 算法
带你读《图解算法小抄》十三、字典树(1)
带你读《图解算法小抄》十三、字典树(1)
|
机器学习/深度学习 算法
《JavaSE-习题篇二》之七个题目,十六张图,让你不惧递归。
《JavaSE-习题篇二》之七个题目,十六张图,让你不惧递归。
|
9月前
树形dp之没有上司的舞会
树形dp之没有上司的舞会
|
9月前
力扣370周赛 -- 第三题(树形DP)
力扣370周赛 -- 第三题(树形DP)
|
9月前
|
存储 人工智能 BI
树形dp总结
树形dp总结
74 0