首页 > 代码库 > poj 2342 anniversary party
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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。