很好的树形DP入门题,看着和选课那道题如出一辙。

Problem Description
ACboy很喜欢玩一种战略游戏,在一个地图上,有N座城堡,每座城堡都有一定的宝物,在每次游戏中ACboy允许攻克M个城堡并获得里面的宝物。但由于地理位置原因,有些城堡不能直接攻克,要攻克这些城堡必须先攻克其他某一个特定的城堡。你能帮ACboy算出要获得尽量多的宝物应该攻克哪M个城堡吗?
Input
每个测试实例首先包括2个整数,N,M.(1 <= M <= N <= 200);在接下来的N行里,每行包括2个整数,a,b. 在第 i 行,a 代表要攻克第 i 个城堡必须先攻克第 a 个城堡,如果 a = 0 则代表可以直接攻克第 i 个城堡。b 代表第 i 个城堡的宝物数量, b >= 0。当N = 0, M = 0输入结束。
Output
对于每个测试实例,输出一个整数,代表ACboy攻克M个城堡所获得的最多宝物的数量。
Sample Input
3 2 0 1 0 2 0 3 7 4 2 2 0 1 0 4 2 1 7 1 7 6 2 2 0 0
Sample Output
5 13
直接上代码啦:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4
 5 using namespace std;
 6
 7 int dp[208][208],map[208][208];
 8 int num[208];
 9 bool visited[208];
10 int N,M;
11
12 inline int max(int a,int b)
13 {
14     if(a>b) return a;
15     return b;
16 }
17
18 int TreeDP(int father)
19 {
20     visited[father]=true;           //第father号城市已访问过
21     for(int i=1;i<=num[father];i++) //遍历以father为根节点的子节点
22     {
23         int son=map[father][i];
24         if(!visited[son]) TreeDP(son);//递归遍历直至为叶子节点,然后返回
25         for(int j=M;j>=2;j--)//j>=2的原因是输入a,b是j=1已经考虑进去了
26             for(int k=1;k<j;k++)//拆分
27             {
28                 if(dp[father][j-k]!=-1&&dp[son][k]!=-1)//是否可以进行拆分
29                     dp[father][j]=max(dp[father][j],dp[father][j-k]+dp[son][k]);//由状态转移方程式得
30             }
31     }
32 }
33 int main()
34 {
35     //dp[i][j]代表的是攻克包括第i号城市在内的共j座城市所获得的财富值
36     int a,b;
37     while(scanf("%d %d",&N,&M),N||M)//M原本代表ACBoy要攻打城市的个数,但为了方便森林变成数时更好统计就把M++,这样0号城市也纳入其中
38     {
39         memset(dp,-1,sizeof(dp));
40         memset(num,0,sizeof(num));//num[father]表示以father为根节点的子节点个数有多少个
41         dp[0][1]=0;
42         for(int i=1;i<=N;i++)
43         {
44             scanf("%d %d",&a,&b);
45             dp[i][1]=b;         //攻打第i号城市的财富值
46             map[a][++num[a]]=i; //构成一棵树,第0号城市为根节点
47         }
48         M++;
49         for(int i=0;i<=N;i++)//初始化
50          {
51              dp[i][0]=0;
52              visited[i]=false;
53          }
54         TreeDP(0);
55         printf("%d\n",dp[0][M]);
56     }
57
58     return 0;
59 }

View Code

dp[i][j]代表的是包括第i座城市在内的共j座城市所获得的最大财富值

转载于:https://www.cnblogs.com/Chinahenu/p/3914245.html

树形DP-HDU1561 The more, The Better相关推荐

  1. hdu1561 树形dp

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

  2. 动态规划 —— 树形 DP

    [概述] 树形动态规划是在树的数据结构上的动态规划,在各个阶段呈现树状关系的时候可以采用树形 DP,其基本思想是由子节点的信息推出父节点的信息. 树形 DP 中,是通过以下 4 点树的特点来进行建图的 ...

  3. BNUOJ 52305 Around the World 树形dp

    题目链接: https://www.bnuoj.com/v3/problem_show.php?pid=52305 Around the World Time Limit: 20000msMemory ...

  4. [树形dp] Jzoj P5233 概率博弈

    Description 小A和小B在玩游戏.这个游戏是这样的: 有一棵n个点的以1为根的有根树,叶子有权值.假设有m个叶子,那么树上每个叶子的权值序列就是一个1->m 的排列. 一开始在1号点有 ...

  5. fwt优化+树形DP HDU 5909

    1 //fwt优化+树形DP HDU 5909 2 //见官方题解 3 // BestCoder Round #88 http://bestcoder.hdu.edu.cn/ 4 5 #include ...

  6. BZOJ 1040 ZJOI2008 骑士 树形DP

    题目大意:给定一个基环树林,每一个点上有权值,要求选择一个权值和最大的点集,要求点集中的随意两个点之间不能直接相连 最大点独立集--考虑到n<=100W,网络流铁定跑不了,于是我们考虑树形DP ...

  7. POJ 3342 树形DP+Hash

    这是很久很久以前做的一道题,可惜当时WA了一页以后放弃了. 今天我又重新捡了起来.(哈哈1A了) 题意: 没有上司的舞会+判重 思路: hash一下+树形DP 题目中给的人名hash到数字,再进行运算 ...

  8. [NC15748]旅游 树形dp基础

    菜鸡第一次接触树形dp这个东西,不过这个东西还是很好理解的(可能是因为模板题吧) 个人感觉,相比线性dp,树形dp的状态转移方程更加的直观,难点主要是在"树"的结构上比较麻烦. 题 ...

  9. 容斥 + 树形dp ---- 2021 icpc 沈阳 L Perfect Matchings

    题目链接 题目大意: 就是给你一个2n2n2n个点的完全图,从这个图里面抽出2n−12n-12n−1条边,这些边形成一颗树,现在问你剩下的图里面点进行完美匹配有多少种方案? 解题思路: 一开始被完美匹 ...

  10. 树形dp ---- gym101667 A(贪心 + 树形dp + 两个dp方程组维护)

    题目链接 题目大意: 就是一棵5e35e35e3的树,可以选择一些点,放上基站,如果uuu上的基站价值为ddd,那么距离uuu小于等于ddd的点都会被覆盖,问使得整棵树被覆盖需要的最小价值. 解题思路 ...

最新文章

  1. 华为云家庭视频监控帮你一起守护家
  2. 二十三、死锁的处理策略---避免死锁(银行家算法)
  3. DOS循环:bat/批处理for命令详解之一 (史上虽详尽的总结和说明~~)
  4. PHP ORM框架ezpdo(2)之EZPDOSQL
  5. View工作原理(四)view的layout过程
  6. XHTML行内描述性元素(持续更新中)
  7. linux shell用户交互,鱼 - 一个明智的和用户友好的交互式shell为Linux
  8. 数据量大和高并发解决方法
  9. How where used list in SAP GUI is implemented
  10. [css] css中Scroll-behavior属性有什么应用场景?
  11. 纯做技术是自娱自乐 抛开技术做技术才是出路
  12. C#中get和SET
  13. python 货币换算库,货币转换python代码你知道怎么写吗?
  14. 中国历史上最伟大帝王排行榜
  15. 用html5画瀑布图,漂亮的Excel瀑布图,竟然如此简单~~
  16. java 图片相似度_GitHub - java51talk/image-similarity: 计算图片之间的相似度
  17. 如何提高信息流广告的转化率?
  18. Android谷歌地图地理编码,谷歌地图API地理编码多个地点
  19. web 自动化测试(入门篇)
  20. 线性代数【初等变换】

热门文章

  1. sql 在某表中加入一列count所有数据_执行COUNT(1)、COUNT(*) 与 COUNT(列名) 到底有什么区别?...
  2. java 控制语句_java两个控制语句(转)
  3. python12_Python 12 基础知识
  4. 2020年9月北京计算机等级考试考点,2020年9月北京计算机等级考试考点设置
  5. 计算机无法进系统咋办,主编教您电脑无法进入系统怎么办
  6. outlook qr码在哪里_高能手办团兑换码有哪些 高能手办团哪里兑换
  7. php读取oracle,php读取oracle中数据库文件
  8. 2017长春java平均工资_速看!长春平均工资出炉!
  9. android studio 2.2.3 ndk 添加 C 和 C++ 代码
  10. 心语收集12:我以为要是唱的用心良苦,你就会对我多点在乎