hdu1502 树形dp入门题

没有上司的舞会....初一就做过了.....

#include<bits/stdc++.h>
#define MAXN 6005
using namespace std;

int n,tot,ans;
int a[MAXN],h[MAXN],in[MAXN],f[MAXN][3];
struct node{
    int from,to,next;
}e[MAXN<<1];

void init(){
    tot=ans=0;
    memset(h,-1,sizeof(h));
    memset(in,0,sizeof(in));
    memset(f,0,sizeof(f));
}

void add(int x,int y){
    tot++;
    e[tot].from=x;
    e[tot].to=y;
    e[tot].next=h[x];
    h[x]=tot;
}

int dfs(int now,int fa){
    f[now][1]=a[now];
    f[now][0]=0;
    for(int i=h[now];i!=(-1);i=e[i].next){
            dfs(e[i].to,now);
            f[now][1]=max(f[now][1],f[now][1]+f[e[i].to][0]);
            f[now][0]=max(f[now][0],f[now][0]+max(f[e[i].to][0],f[e[i].to][1]));
    }
}

int main(){
    while(scanf("%d",&n)==1){
        for(int i=1;i<=n;i++)scanf("%d",&a[i]);
        init();
        while(1){
            int x,y;cin>>x>>y;if(x==0&&y==0)break;
            add(y,x);
            in[x]++;
        }
        for(int i=1;i<=n;i++){
            if(in[i]==0){
            dfs(i,i);
            ans+=max(f[i][0],f[i][1]);    
            }
        }
        cout<<ans<<endl;
    }
}
View Code
原文地址:https://www.cnblogs.com/shatianming/p/12299433.html