CF533B Work Group
妙妙树形dp
当不选时,的子节点个数为奇数还是偶数都可以
当选时,的子节点个数必须为偶数
这样可以搞一个状态总数为或者的dp(前者更好理解)
#pragma GCC optimize(2) #include<bits/stdc++.h> using namespace std; #define fr first #define se second #define et0 exit(0); #define rep(i, a, b) for(int i = (int)(a); i <= (int)(b); i ++) #define rrep(i, a, b) for(int i = (int)(a); i >= (int)(b); i --) #define IO ios::sync_with_stdio(false),cin.tie(0); typedef long long LL; typedef pair<int, int> PII; typedef pair<LL, LL> PLL; typedef unsigned long long ULL; const int INF = 0X3f3f3f3f, N = 1e6 + 10, MOD = 1e9 + 7; const double eps = 1e-7, pi = acos(-1); int n; LL a[N]; LL f[N][2]; vector<int> g[N]; void dfs(int u, int fa) { f[u][1] = -1e18; rep (i, 0, g[u].size() - 1) { int v = g[u][i]; dfs(v, u); LL x = f[u][0], y = f[u][1]; f[u][0] = max(f[v][1] + y, f[v][0] + x); f[u][1] = max(f[v][0] + y, f[v][1] + x); } f[u][1] = max(f[u][1], f[u][0] + a[u]); } void work() { cin >> n; rep (i, 1, n) { int p; cin >> p >> a[i]; if (p != -1) g[p].push_back(i); } dfs(1, 0); cout << max(f[1][0], f[1][1]) << endl; } signed main() { IO int test = 1; while (test--) { work(); } return 0; }
本文作者:xhy666
本文链接:https://www.cnblogs.com/xhy666/p/16732762.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步