HDU - 1520 Anniversary party (有向入门树形DP)
Posted djh0709
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU - 1520 Anniversary party (有向入门树形DP)相关的知识,希望对你有一定的参考价值。
题目链接:https://vjudge.net/problem/HDU-1520
InputEmployees are numbered from 1 to N. A first line of input contains a number N. 1 <= N <= 6 000. Each of the subsequent N lines contains the conviviality rating of the corresponding employee. Conviviality rating is an integer number in a range from -128 to 127. After that go T lines that describe a supervisor relation tree. Each line of the tree specification has the form:
L K
It means that the K-th employee is an immediate supervisor of the L-th employee. Input is ended with the line
0 0OutputOutput should contain the maximal sum of guests‘ ratings.
Sample Input
7 1 1 1 1 1 1 1 1 3 2 3 6 4 7 4 4 5 3 5 0 0
Sample Output
5
题意:在一个有根树上每个节点有一个权值,每相邻的父亲和孩子只能选择一个,
问怎么选择总权值之和最大。
思路:从根出发找,dp[i][0]表示节点i不选,dp[i][1]节点i选。
AC代码:
#include<stdio.h> #include<vector> #include<string.h> #include<algorithm> using namespace std; const int maxn=6010; vector<int>map[maxn]; int dp[maxn][2],a[maxn],N,vis[maxn]; void dfs(int u){ dp[u][0]=0; dp[u][1]=a[u]; for(int i=0;i<map[u].size();i++) { int v=map[u][i]; dfs(v); dp[u][0]+=max(dp[v][0],dp[v][1]); dp[u][1]+=dp[v][0]; } } int main(){ while(~scanf("%d",&N)){ for(int i=1;i<=N;i++) scanf("%d",&a[i]); for(int i=1;i<=N;i++) map[i].clear(); memset(vis,0,sizeof(vis)); int u,v; while(scanf("%d%d",&v,&u)&&u&&v) { map[u].push_back(v); vis[v]++; } for(int i=1;i<=N;i++) if(!vis[i]){ dfs(i); printf("%d ",max(dp[i][0],dp[i][1])); break; } } return 0; }
以上是关于HDU - 1520 Anniversary party (有向入门树形DP)的主要内容,如果未能解决你的问题,请参考以下文章
HDU-1520 Anniversary party (树形DP)
HDU - 1520 Anniversary party (有向入门树形DP)
HDU1520 Anniversary party 树形DP基础