树形DP
Posted nioh
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树形DP相关的知识,希望对你有一定的参考价值。
树形DP是一种建立在树状结构的DP思想。
每个父结点的状态,都是由它的子结点转移过来的。
有一道很经典的入门题没有上司的舞会,就是每个结点都有一个权值且父子结点不能都取的情况下求最大总权值。
https://www.luogu.com.cn/problem/P1352
#include<bits/stdc++.h> using namespace std; const int maxn = 6010; int N, R[maxn], h, p[maxn] = {0}, dp[maxn][2] = {0}; vector<int> g[maxn]; void dfs(int x) { dp[x][1] = R[x]; for(auto c : g[x]) { dfs(c); dp[x][0] += max(dp[c][0], dp[c][1]); dp[x][1] += dp[c][0]; } } int main() { cin >> N; for(int i = 1; i <= N; i++) scanf("%d", R + i); int a, b; for(int i = 0; i < N - 1; i++) scanf("%d%d", &a, &b), g[b].push_back(a), p[a] = 1; for(int i = 1; i <= N; i++) if(!p[i]) h = i; dfs(h); cout << max(dp[h][0], dp[h][1]); }
以上是关于树形DP的主要内容,如果未能解决你的问题,请参考以下文章
Starship Troopers(HDU 1011 树形DP)