• HDU1520 Anniversary party(树形dp入门题)


    题意:

    给定一棵关系树,每个节点有个权值,子节点和父节点不能同时选,问最后能选的最大价值是多少?

    思路:

    dp[i][1]表示选,dp[i][0]表示不选

    则状态转移方程为:

    dp[i][1]+=dp[j][0];

    dp[i][0]+=max(dp[j][1],dp[j][0]);

    AC代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <string>
    #include <queue>
    #include <cmath>
    #include <algorithm>
    using namespace std;
    #define N 6010
    int dp[N][2];
    vector<int>son[N];
    bool vis[N];
    void treedp(int p)
    {
        vis[p]=1;
        for(int i=0; i<son[p].size(); i++)
        {
            int u=son[p][i];
            if(!vis[u]) treedp(u);
            dp[p][1]=dp[p][1]+dp[u][0];
            dp[p][0]=dp[p][0]+max(dp[u][0],dp[u][1]);
        }
    }
    int main()
    {
        //freopen("in.txt","r",stdin);
        int n,p,q;
        while(~scanf("%d",&n))
        {
            memset(dp,0,sizeof(dp));
            for(int i=1; i<=n; i++)
            {
                scanf("%d",&dp[i][1]);
                son[i].clear();
            }
            memset(vis,0,sizeof(vis));
            while(scanf("%d%d",&p,&q)&&(p+q))
            {
                son[q].push_back(p);
                vis[p]=1;
            }
            int root;
            for(int i=1; i<=n; i++)
                if(!vis[i])
                {
                    root=i;
                    break;
                }
            memset(vis,0,sizeof(vis));
            treedp(root);
            printf("%d
    ",max(dp[root][0],dp[root][1]));
        }
        return 0;
    }
  • 相关阅读:
    swoole 的 go function 是什么
    MySQL grant之后要不要跟上 flush privileges
    操作数据库
    APP端异常情况
    评论列表优化联表问题
    tp5修改数据前过滤
    字典
    if语句
    【整理】android事件传递机制
    Linux常用操作
  • 原文地址:https://www.cnblogs.com/d-e-v-i-l/p/5297770.html
Copyright © 2020-2023  润新知