zoukankan      html  css  js  c++  java
  • 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
    ",max(dp[root][0], dp[root][1]));
        }
    }
  • 相关阅读:
    Codis的源码编译生成tar包
    Jenkins安装war版本
    Eclipse中src/main/resources配置文件启动问题
    关于Web项目的pom文件处理
    spark streaming的理解和应用
    Azkaban安装
    Mysql安装
    Oracle递归操作
    WebService 入门
    BaseAction 类
  • 原文地址:https://www.cnblogs.com/sweat123/p/5016661.html
Copyright © 2011-2022 走看看