poj 2342 anniversary party
Posted jack_yyc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了poj 2342 anniversary party相关的知识,希望对你有一定的参考价值。
题目大意:
n个人的关系为一棵树,有一个party,邀请了一个人,那么就不能邀请n的上级,求最多能邀请到多少人
思路:
树形dp
两个dp数组分别表示取n的时候的最大值和不取n的时候的最大值
如果取n,那么dp1[n]=它所有儿子的dp2之和
如果不取n,那么dp2[n]=它所有儿子的max(dp1,dp2)之和
最后输出根的max(dp1,dp2)
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> #include<vector> using namespace std; int ans,n,a[6020],dp[6020][2],x,t; vector <int> vec[6020]; void dp1(int i) { if(vec[i].size()==0) {dp[i][0]=a[i];dp[i][1]=0;return ;} for(int j=0;j<vec[i].size();j++) { dp1(vec[i][j]); dp[i][0]+=dp[vec[i][j]][1]; dp[i][1]+=max(dp[vec[i][j]][1],dp[vec[i][j]][0]); } dp[i][0]+=a[i]; ans=max(ans,max(dp[i][1],dp[i][0])); return ; } int main() { scanf("%d",&n); int rt=0; for(int i=1;i<=n;i++) scanf("%d",&a[i]); if(n==1) {printf("%d",a[n]);return 0;} while(scanf("%d%d",&x,&t)&&x!=0) { if(rt==0) rt=t; if(x==rt) rt=t; vec[t].push_back(x); } dp1(rt); printf("%d",ans); }
以上是关于poj 2342 anniversary party的主要内容,如果未能解决你的问题,请参考以下文章
poj2342 Anniversary party (树形dp)