zoukankan      html  css  js  c++  java
  • HDU1561 The more, The Better(树形dp)

    题意:

    给定n个点,每个地点有value[i]的宝物,而且有的宝物必须是另一个宝物取了才能取,问取m个点可以获得的最多宝物价值

    思路:

    树形dp搞一下,0为根节点,m要+1,dfs从0开始跑一遍就好了

    /* ***********************************************
    Author        :devil
    Created Time  :2016/3/23 19:23:54
    ************************************************ */
    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <queue>
    #include <set>
    #include <map>
    #include <string>
    #include <cmath>
    #include <stdlib.h>
    using namespace std;
    #define N 210
    int n,m,dp[N][N],v[N];
    bool vis[N];
    vector<int>eg[N];
    void init()
    {
        for(int i=0;i<=n;i++)
            eg[i].clear();
        memset(dp,0,sizeof(dp));
        memset(vis,false,sizeof(vis));
    }
    void dfs(int u)
    {
        vis[u]=true;
        dp[u][1]=v[u];
        for(int i=0;i<eg[u].size();i++)
        {
            int to=eg[u][i];
            if(!vis[to]) dfs(to);
            for(int j=m;j>=1;j--)
                for(int k=1;k<j;k++)
                    dp[u][j]=max(dp[u][j],dp[u][k]+dp[to][j-k]);
        }
    }
    int main()
    {
        //freopen("in.txt","r",stdin);
        int x,y;
        while(~scanf("%d%d",&n,&m)&&(n+m))
        {
            init();
            for(int i=1;i<=n;i++)
            {
                scanf("%d%d",&x,&y);
                v[i]=y;
                eg[x].push_back(i);
            }
            m++;
            dfs(0);
            printf("%d
    ",dp[0][m]);
        }
        return 0;
    }
  • 相关阅读:
    go语言学习-接口
    go语言学习-函数
    go语言学习-常用命令
    go语言学习-数组-切片-map
    go语言学习-基础知识
    go语言学习-安装和配置
    python套接字基本使用
    debian 10 firewall-cmd --reload 报错
    synchronized 关键字
    Filebeat+Kafka+Logstash+ElasticSearch+Kibana 日志采集方案
  • 原文地址:https://www.cnblogs.com/d-e-v-i-l/p/5314442.html
Copyright © 2011-2022 走看看