树形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月前
|
机器学习/深度学习 数据采集 人工智能
奥卡姆剃刀原理
奥卡姆剃刀原理“【5月更文挑战第17天】”
80 4
|
4月前
|
数据采集 自然语言处理 算法
Sekiro原理
这篇文章介绍了SEKIRO,一个多语言的、分布式的、与网络拓扑无关的服务发布平台,它支持通过编写不同语言的handler将功能发布到中心API市场,并通过RPC方式调用,特别适用于受限环境下的功能外放和服务提供。
65 0
|
7月前
|
编译器 C++ 容器
C++模板的原理及使用
C++模板的原理及使用
|
Kubernetes 监控 调度
k8s 自身原理 4
k8s 自身原理 4
|
Kubernetes 监控 Cloud Native
k8s 自身原理 3
k8s 自身原理 3
|
Kubernetes 监控 Linux
k8s 自身原理 5
k8s 自身原理 5
|
存储 Kubernetes API
k8s 自身原理 1
k8s 自身原理 1
|
Kubernetes Cloud Native 调度
k8s 自身原理 2
k8s 自身原理 2
|
存储 缓存 算法
四、深入剖析【离屏渲染】原理
深入剖析【离屏渲染】原理
535 0
四、深入剖析【离屏渲染】原理