hdu1520 树形dp

 树形dp入门,在树上进行dp。

状态转移方程:

dp[i][0] = max(dp[j][0], dp[j][1]);//i为j的上司 并且i不来

dp[i][1] = dp[j][0];//i来了

用vector实现 rt表示树。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <vector>
using namespace std;
const int MAXN = 6010;
vector<int> rt[MAXN];
int dp[MAXN][2],n,vis[MAXN], pa[MAXN];
int max(int x,int y){
    return x>y?x:y;
}
void tree_dp(int root)
{
    vis[root] = 1;
    int len = rt[root].size();
    for(int i=0; i<len; i++){
        if(!vis[rt[root][i]]){
            tree_dp(rt[root][i]);
            dp[root][1] += dp[rt[root][i]][0];
            dp[root][0] += max(dp[rt[root][i]][0], dp[rt[root][i]][1]);
        }
    }
}
int main()
{
    int i;
    while(~scanf("%d",&n))
    {
        memset(dp,0,sizeof(dp));
        memset(vis,0,sizeof(vis));
        memset(pa,-1,sizeof(pa));
        for(i=1; i<=n; ++i){
            int v;
            rt[i].clear();
            scanf("%d",&v);
            dp[i][1] = v;
        }
        int x,y;
        while(scanf("%d%d",&x,&y)){
            if(!x && !y)break;
            pa[x] = y;
            rt[y].push_back(x);
        }
        int root = 1;
        while(pa[root]!=-1)
            root = pa[root];
        tree_dp(root);
        printf("%d\n",max(dp[root][0], dp[root][1]));
    }
}

 

posted @ 2015-12-03 16:22  sweat123  阅读(110)  评论(0编辑  收藏  举报