hdu 1520 Anniversary party
这一题是我写的第一个树形dp题。
View Code
#include <iostream> #include <cstdio> #include <memory.h> #include <algorithm> using namespace std; const int INF = 6005; int l[INF],r[INF]; int d[INF],w[INF]; bool vis[INF],in[INF]; int dp[INF][2]; void add(int x,int y){ if(d[x]==0)l[x]=y; else r[d[x]]=y; d[x]=y; } void dfs(int idx){ int k,t; if(vis[idx])return; vis[idx]=1; if(l[idx]==0){ dp[idx][0]=0; dp[idx][1]=w[idx]; return; } k = l[idx]; while(k){ dfs(k); dp[idx][0]+=max(dp[k][0],dp[k][1]); dp[idx][1]+=dp[k][0]; k=r[k]; } dp[idx][1]+=w[idx]; } int main(){ int n,a,b,ans=0; while(scanf("%d",&n)!=EOF){ memset(vis,0,sizeof(vis)); memset(dp,0,sizeof(dp)); memset(l,0,sizeof(l)); memset(r,0,sizeof(r)); memset(d,0,sizeof(d)); for(int i=1;i<=n;i++){ scanf("%d",&w[i]); } while(scanf("%d%d",&a,&b),a||b){ add(b,a); in[a]=1; } for(int i=1;i<=n;i++){ if(!in[i]){ dfs(i); ans=max(dp[i][0],dp[i][1]); break; } } printf("%d\n",ans); } return 0; }

浙公网安备 33010602011771号