题意:给一个森林,n个节点,每个点有点权,问若从中刚好选择m个点(选择某点之前必须先选择了其父亲),使得这m个点权之和最大为多少?

思路:

  比较常规。就是DFS一次,枚举在子树中可能选择的k个点(注意上限为min(子树节点数,到此子树最多可选节点数)),需要注意的是dp[t][1]必须是点t自己,枚举的时候必须先选择t才能选择t的孩子。但是本题是森林,那么可以建1个虚拟根编号为0(根输入一模一样),然后虚拟根的权为0即可,而所要选的数就变成m+1了。

 1 #include <bits/stdc++.h>
 2 #define pii pair<int,int>
 3 #define max(x,y) (x>y?x:y)
 4 #define min(x,y) (x<y?x:y)
 5 #define INF 0x3f3f3f3f
 6 #define LL long long
 7 using namespace std;
 8 const int N=210;
 9
10 struct node
11 {
12     int from,to,val,next;
13     node(){};
14     node(int from,int to,int val,int next):from(from),to(to),val(val),next(next){};
15 }edge[N];
16 int head[N], n, edge_cnt;
17 void add_node(int from,int to,int val)
18 {
19     edge[edge_cnt]=node(from, to, val, head[from]);
20     head[from]=edge_cnt++;
21 }
22
23 int dp[N][N];
24 int DFS(int t,int m,int val)
25 {
26     if(m==0)    return 0;   //点数上限了。
27     dp[t][1]=val;           //只能挑1个点时,必须挑自己
28     node e;
29     int sum=1;
30     for(int i=head[t]; i!=-1&&m>1; i=e.next)
31     {
32         e=edge[i];
33         int tmp=DFS(e.to, m-1, e.val);  //最多可以在e.to子树中选多少个点
34         sum+=tmp;
35
36         for(int j=sum; j>1; j--)
37             for(int k=1; k<=tmp&& k<j; k++) //保证j-k>=1,因为t是必选的
38                 if(dp[t][j-k]>=0)
39                     dp[t][j]=max(dp[t][j], dp[t][j-k]+dp[e.to][k]);
40     }
41     return sum; //返回在本子树中可以选的点数上限
42 }
43
44 int main()
45 {
46     //freopen("input.txt", "r", stdin);
47     int a,b,m;
48     while(scanf("%d%d",&n,&m),n+m)
49     {
50         memset(head, -1, sizeof(head));
51         memset(dp, -1, sizeof(dp));
52         edge_cnt=0;
53
54         for(int i=1; i<=n; i++)
55         {
56             scanf("%d%d",&a,&b);
57             add_node(a,i,b);
58         }
59         DFS(0, m+1, 0); //0是虚拟根
60         printf("%d\n", dp[0][m+1]);
61     }
62     return 0;
63 }

AC代码

转载于:https://www.cnblogs.com/xcw0754/p/4818842.html

HDU 1561 The more, The Better (树形DP,常规)相关推荐

  1. hdu 1561 The more, The Better 树形dp

    http://acm.hdu.edu.cn/showproblem.php?pid=1561 做树形dp比较小. 先上网学习下,总结下套路. dp[i][j]表示在第i个节点,有j个名额选的时候的最大 ...

  2. HDU 1561 The more, The Better (树形dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1561 题意不讲了,中文. 树形背包,可以以0为总root,m++.dp[i][j] 表示以i节点为ro ...

  3. HDU - 6769-In Search of Gold-二分+树形dp

    https://vjudge.net/problem/HDU-6769 题目大意:给你n个点,有n-1条边,每条边有a,b两个权值,给你一个k,恰好有k条边的权值取a,其余取b的时候,树的直径的最小值 ...

  4. 【HDU - 5452】Minimum Cut(树形dp 或 最近公共祖先lca+树上差分,转化tricks,思维)

    题干: Given a simple unweighted graph GG (an undirected graph containing no loops nor multiple edges) ...

  5. 【HDU - 1520】Anniversary party (树形dp)

    题干: There is going to be a party to celebrate the 80-th Anniversary of the Ural State University. Th ...

  6. hdu 4799 LIKE vs CANDLE(树形dp)

    题目链接:hdu 4799 LIKE vs CANDLE 解题思路 dp[i][0]表示第i个节点不翻转的最优解,dp[i][1]表示翻转的最优解,每个位置翻转的代价到其父亲节点的位置再计算. 代码 ...

  7. HDU 4276 The Ghost Blows Light(树形DP)

    题意:给出一棵无向树,从1走到n,总时间为T,每走一条边需要花费一定时间,每个结点有一定权值,问在指定时间内到达n点能获取的最大权值. 由于已经到过的点能再次返回(虽然不能再次获得该点权值),情况数倍 ...

  8. HDU 4123 Bob’s Race(树形DP+RMQ)

     题目大意:给定一棵树,每一个点都从当前位置走到距离最远的位置,1~n的连续区间中最大并且走的最远距离差值不超过Q的区间右多大. 思路:首先求出每个点能到达的最远距离,这一步有两种做法: 第一种做 ...

  9. hdu 1561 The more, The Better (依赖背包 树形dp)

    题目: 链接:点击打开链接 题意: 非常明显的依赖背包. 思路: dp[i][j]表示以i为根结点时攻击j个城堡得到的最大值.(以i为根的子树选择j个点所能达到的最优值) dp[root][j] = ...

  10. hdu 1520 Anniversary party(第一道树形dp)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1520 Anniversary party Time Limit: 2000/1000 MS (Java ...

最新文章

  1. mysql 获取自增id的值的方法
  2. 离线轻量级大数据平台Spark之MLib机器学习库TF-IDF实例
  3. 国产化达梦数据库数据迁移文档:oracle11g数据库转达梦8数据库实例演示
  4. 【C++】Visual Studio教程(十二) -代码编辑器功能
  5. STL-String源码分析
  6. kafka streams_Kafka REST Proxy for MapR Streams入门
  7. 三款新功能发布,助力阿里云表格存储再次升级
  8. 最经典的职场十大理论,好文值得一看滴童鞋们。2
  9. 义乌成直播电商掘金地
  10. 马尔可夫决策过程(MDP)
  11. python起多进程服务_python 多进程详细总结
  12. js分页组件laypage
  13. dotcms open source java cms_开放源Java(JSP)CMS系统的推荐源代码
  14. 智能计算/计算智能、仿生算法、启发式算法的区别与关系?
  15. Dynamics CRM 365 - 零基础入门学习后端插件语法总结(样例使用方法)
  16. 数学建模(三)SARS的传播(03年A题)
  17. 算法导论8.4-4-单位圆中均匀分布情况--桶排序
  18. IDEA中写代码间距变大报红,报错Cannot resolve symbol
  19. 【Raft】学习九:成员变更ConfChangeV2
  20. matlab 梯度 什么意思,浅谈Matlab中的梯度(gradient)

热门文章

  1. SpringBoot-切面AOP实现统一逻辑处理
  2. linux打开应用程序的命令,Windows环境下如何通过命令打开程序!
  3. 工业机器人调运角度_站在全球角度,看待中国工业机器人
  4. java setcharat,Java StringBuffer setCharAt()方法
  5. KubeMeet 深圳站完整议题出炉 快来 get 云原生边缘计算硬核技术动态
  6. 阿里云入选 2021 Gartner APM 魔力象限,国内唯一入选云厂商
  7. 罗美琪和春波特的故事...
  8. 基于 RocketMQ Prometheus Exporter 打造定制化 DevOps 平台
  9. 电子书下载 | 超实用!阿里售后专家的 K8s 问题排查案例合集
  10. mysql c contor_Python之那些好玩的图画