题目链接。
题意:
给定义个多叉树,每个结点上都有一个权值。子结点和父结点不能同时选。求最大的权值和。
分析:
利用左儿子右兄弟原则转化成二叉树,DP。
代码如下:
#include <iostream> #include <cstring> #include <cstdio> #include <cstdlib> using namespace std; const int maxn = 6000 + 10; struct Tree { int father, child, brother; int Take, Not; void init() { father = child = brother = Not = 0; } }tree[maxn]; void dfs(int idx) { int child = tree[idx].child; while(child) { dfs(child); tree[idx].Take += tree[child].Not; tree[idx].Not += max(tree[child].Take, tree[child].Not); child = tree[child].brother; } } int main(){ int n, x; while(scanf("%d", &n) == 1) { for(int i=1; i<=n; i++) { scanf("%d", &x); tree[i].init(); tree[i].Take = x; } int L, K; while(scanf("%d%d", &L, &K) == 2) { if(L == 0 && K == 0) break; tree[L].father = K; tree[L].brother = tree[K].child; tree[K].child = L; } for(int i=1; i<=n; i++) { if(!tree[i].father) { dfs(i); printf("%d\n", max(tree[i].Take, tree[i].Not)); break; } } } return 0; }