POJ 2342 Anniversary party
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 2342 Anniversary party相关的知识,希望对你有一定的参考价值。
树形DP入门题。感觉负数的那些节点一定是不要选的,本着这个原则写了一发...AC了。
#include<cstdio> #include<cstring> #include<cmath> #include<ctime> #include<vector> #include<algorithm> using namespace std; const int maxn=6000+10; int N; int val[maxn]; vector<int>tree[maxn]; int tot[maxn]; int dp[maxn][5]; int ans; void init() { memset(tot,0,sizeof tot); for(int i=0;i<=N;i++) tree[i].clear(); memset(dp,0,sizeof dp); ans=0; } void read() { for(int i=1;i<=N;i++) { scanf("%d",&val[i]); tree[i].clear(); } while(1) { int u,v; scanf("%d%d",&u,&v); tree[v].push_back(u); tot[u]++; if(!u&&!v) break; } } void dfs(int now) { if(tree[now].size()==0) { dp[now][0]=0; dp[now][1]=max(val[now],0); } for(int i=0;i<tree[now].size();i++) dfs(tree[now][i]); int sum1=0; int sum2=0; for(int i=0;i<tree[now].size();i++){ sum1=sum1+dp[tree[now][i]][0]; sum2=sum2+max(dp[tree[now][i]][0],dp[tree[now][i]][1]); } sum1=sum1+val[now]; dp[now][0]=sum2; dp[now][1]=max(dp[now][1],sum1); } void work() { for(int i=1;i<=N;i++) if(!tot[i]){ dfs(i); ans=ans+max(dp[i][0],dp[i][1]); } printf("%d\n",ans); } int main() { while(~scanf("%d",&N)) { init(); read(); work(); } return 0; }
以上是关于POJ 2342 Anniversary party的主要内容,如果未能解决你的问题,请参考以下文章
poj2342 Anniversary party (树形dp)