标签:
题目链接:
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/32768 K (Java/Others)
/* 1520 124MS 1988K 1430 B G++ 2014300227*/ #include <bits/stdc++.h> using namespace std; const int N=6e3+4; typedef long long ll; const double PI=acos(-1.0); int n,a[N],vis[N],dp[N][2],fa[N]; vector<int>ve[N]; void dfs(int x) { vis[x]=1; int len=ve[x].size(); if(len==0) { dp[x][0]=0; dp[x][1]=max(0,a[x]); return ; } else { int sum1=0,sum2=0; for(int i=0;i<len;i++) { int y=ve[x][i]; if(!vis[y])dfs(y);//加个判断可以避免重复迭代; sum1+=max(dp[y][0],dp[y][1]); sum2+=dp[y][0]; } dp[x][0]=sum1; dp[x][1]=sum2+max(0,a[x]); } } int main() { while(scanf("%d",&n)!=EOF) { for(int i=1;i<=n;i++) { fa[i]=-1; vis[i]=0; dp[i][0]=dp[i][1]=0; ve[i].clear(); scanf("%d",&a[i]); } int u,v; while(1) { scanf("%d%d",&u,&v); if(u==0&&v==0)break; fa[u]=v; ve[v].push_back(u); } int ans=0; for(int i=1;i<=n;i++) { if(!vis[i]) { dfs(i); } } for(int i=1;i<=n;i++) { if(fa[i]==-1) { int mmax=max(dp[i][1],dp[i][0]); if(mmax>0)ans+=mmax; } } printf("%d\n",ans); } return 0; }
hdu-1520 Anniversary party(树形dp)
标签:
原文地址:http://www.cnblogs.com/zhangchengc919/p/5379946.html