zoukankan      html  css  js  c++  java
  • hdu1561 树形dp

    题意:
          给你n个东西,每个东西有自己的价值,让你从里面最多取出m个物品,问最大的价值,有的物品有限制,就是必须先取出某个物品后才能取出这个物品。


    思路:

          树形dp,应该是树形的01背包吧,自己dp太渣了,看题解看了好久才懂,我对于树形dp的理解目前是 树形第dp就是用树的节点关系,来约束dp更新是的顺序,比如必须更新完子节点才能更新父节点什么的,对于这个题目,我们首先把给的限制关系建立成一个树,取a之前必须取b,那么 add(b ,a),然后开两个数组dp[i][j] 表示的是 以第i个为根节点的时候取了j个物品的最优值tmp[i][j] 则是dp的一个临时值,目的是为了先更新i为根节点的所有子节点,然后在强制吧i加进去,整体的思路就是先更新后面的(后面的就是前面有很长限制的)然后在更新前面的,前面的每一个都是强制更新进去的,保证了正确性,具体看代码。


    #include<stdio.h>
    #include<string.h>
    
    #define N 200 + 10
    
    typedef struct
    {
       int to ,next;
    }STAR;
    
    STAR E[N];
    int list[N] ,tot;
    int mark[N] ,cost[N];
    int dp[N][N] ,tmp[N][N];
    
    void add(int a ,int b)
    {
       E[++tot].to = b;
       E[tot].next = list[a];
       list[a] = tot;
    }
    
    int maxx(int x ,int y)
    {
       return x > y ? x : y;
    }
    
    void DFS(int root ,int m)
    {
       mark[root] = 1;
       for(int k = list[root] ;k ;k = E[k].next)
       {
          int to = E[k].to;
          if(mark[to]) continue;
          DFS(to ,m);
          for(int i = m ;i >= 0 ;i --)
          for(int j = 0 ;j <= i ;j ++)
          tmp[root][i] = maxx(tmp[root][i] ,tmp[root][i-j] + dp[to][j]);
       }
       for(int i = 1 ;i <= m + 1 ;i ++)
       dp[root][i] = tmp[root][i-1] + cost[root];
    }
    
    int main ()
    {
       int i ,n ,m ,a ,b;
       while(~scanf("%d %d" ,&n ,&m) && n + m)
       {
          memset(list ,0 ,sizeof(list)) ,tot = 1;
          memset(mark ,0 ,sizeof(mark));
          memset(tmp ,0 ,sizeof(tmp));
          memset(dp ,0 ,sizeof(dp));
          for(i = 1 ;i <= n ;i ++)
          {
             scanf("%d %d" ,&a ,&b);
             add(a ,i);
             cost[i] = b;
          }
          DFS(0 ,m);
          printf("%d
    " ,dp[0][m+1]);
       }
       return 0;
    }
          
          
    

  • 相关阅读:
    django学习-33.【一对多】表关系对应的完整业务操作
    django学习-32.发送满足【邮件正文值为一个html页面+有多个附件】的单个邮件
    django学习-31.发送满足【邮件正文值为一个html页面】的单个邮件
    东芝TC10 512G使用半年后掉速严重
    添加Linux服务(Debian 8+,Systemd)
    C# LinkedList
    在VS2019里面 C# 和SqlSerer的勾兑
    Jquery垂直下拉二级菜单
    (二十六)运输层--TCP的拥塞控制的一般原理
    (二十五)运输层--TCP的流量控制
  • 原文地址:https://www.cnblogs.com/csnd/p/12062745.html
Copyright © 2011-2022 走看看