hdu 1520(树形dp)
Posted 发牌员
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu 1520(树形dp)相关的知识,希望对你有一定的参考价值。
刚开始学,自己不服气看了看书就写,写了1个小时没解决,还是看了题解......dp[v][0]表示这个人没来,dp[v][1]表示这个人来了
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <vector> using namespace std; int n; const int maxn=6000+10; int val[maxn]; vector<int> g[maxn]; int dp[maxn][5]; int md[maxn]; void dfs(int x) { dp[x][0]=0; dp[x][1]=val[x]; for(int i=0;i<g[x].size();i++) { int u=g[x][i]; dfs(u); dp[x][0]+=max(dp[u][0],dp[u][1]);//老板不来,员工可以来,也可以不来 dp[x][1]+=dp[u][0];//老板来了,员工不能来 } } int main() { while(~scanf("%d",&n)) { memset(dp,0,sizeof(dp)); memset(md,0,sizeof(md)); for(int i=1;i<=n;i++) g[i].clear(); for(int i=1;i<=n;i++) scanf("%d",&val[i]); int a,b; while(1) { scanf("%d%d",&a,&b); if(!a&&!b) break; g[b].push_back(a); md[a]++; } int mm=0; for(int i=1;i<=n;i++) if(!md[i]) mm=i; dfs(mm); printf("%d\n",max(dp[mm][0],dp[mm][1])); } return 0; }
以上是关于hdu 1520(树形dp)的主要内容,如果未能解决你的问题,请参考以下文章
HDU1520 Anniversary party(树形dp)
HDU-1520 Anniversary party (树形DP)