hdu 4044 GeoDefense (树形dp | 多叉树转二叉树)
题目链接:hdu-4044
题意
这是一个塔防游戏,地图是一个n个编号为1~n的节点的树, 节点1是敌人的基地,其他叶子节点都是你的基地。
敌人的基地会源源不断地出来怪兽,为了防止敌人攻进你的基地,你可以选择造塔。
每个节点最多只能造一个塔,且节点i可以有ki种塔供你选择,价钱和攻击力分别为price_i, power_i
攻击力power_i,效果是让敌人经过这个节点时让敌人的血减少power_i点。
那么从敌人的基地到你的任意一个基地的路径,这条路径上的所有塔的攻击力之和,就是这个基地的抵抗力。
敌人的攻击路径是不确定的,为了保护你的所有基地,你要确定所有基地中抵抗力最低的一个。
你只有数量为m的钱,问最佳方案,可以抵挡敌人的最大血量是多少?也就是,让所有基地中抵抗力最低的一个的值尽量大,
最大是多少?
思路:
方法一: 多叉转二叉
把多叉树先转化成“左儿子,右兄弟”的表示方法。会发现形成这样一种结构图:
多叉树:
转化成“左儿子,右兄弟”的二叉树:
用二叉树来思考这道题,会更自然,也更好想
用f[i][j]表示:子树i, 用j的花费,能防守的最大HP
那么, 先计算出i和它儿子一起用j的花费能防守的最大HP,
f[i][j] = max{ f[i][j-k] + f[son][k] | 0<=k<=j}
然后和它的兄弟进行状态转移:
f[i][j] = max{ min(f[i][j-k], f[brother][k]) | 0<=k<=j}
最终f[1][m]就是答案了.
方法二:
f[u][j]:子树u, 花j的钱的消灭的最大HP
对于子树i, 可以选择分配k(0<=k<=j)的花费给它的所有儿子,留j-k给i点花
对于所有的儿子要合理的分配使用这k的花费,才可以消灭的最大HP,
用maxSon[u][k]表示所有u的所有儿子使用k的花费,可以消灭的最大HP
我们要先求出maxSon数组, 求这个数组就和分组背包一样,因为对于每个儿子,
可以选择分配1...k的花费给它,所以不难得到状态转移:
maxSon[u][j] = max{ min(maxSon[j-k], f[v][k]) | 0<=k<=j & v是u的儿子}
求出这个数组后,就可以跟新节点u的值了
f[u][j] = max{ f[u][j-k] + maxSon[k] | 0<=k<=j }
小结:
上面两种方法,因为之前没做过多叉转二叉,所以一开始我想到的是方法二的,和@ZeroClock学长想的一样。而多叉转二叉是@nothi大神的提醒下知道的,然后我发现转化成二叉树来想这题更加自然,也更不容易出错。
方法一代码:
方法二代码:
hdu 4044 GeoDefense (树形dp | 多叉树转二叉树)的更多相关文章
- 选课 树形DP+多叉树转二叉树+dfs求解答案
问题 A: 选课 时间限制: 1 Sec 内存限制: 128 MB 题目描述 大 学里实行学分.每门课程都有一定的学分,学生只要选修了这门课并考核通过就能获得相应的学分.学生最后的学分是他选修的各门 ...
- HDU 4044 GeoDefense(动态规划)
GeoDefense Time Limit: 12000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- HDU 2196.Computer 树形dp 树的直径
Computer Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- HDU 2196 Computer 树形DP经典题
链接:http://acm.hdu.edu.cn/showproblem.php? pid=2196 题意:每一个电脑都用线连接到了还有一台电脑,连接用的线有一定的长度,最后把全部电脑连成了一棵树,问 ...
- hdu 6201 【树形dp||SPFA最长路】
http://acm.hdu.edu.cn/showproblem.php?pid=6201 n个城市都在卖一种书,该书的价格在i城市为cost[i],商人打算从某个城市出发到另一个城市结束,途中可以 ...
- HDU 2196 Computer 树形DP 经典题
给出一棵树,边有权值,求出离每一个节点最远的点的距离 树形DP,经典题 本来这道题是无根树,可以随意选择root, 但是根据输入数据的方式,选择root=1明显可以方便很多. 我们先把边权转化为点权, ...
- hdu 4081 最小生成树+树形dp
思路:直接先求一下最小生成树,然后用树形dp来求最优值.也就是两遍dfs. #include<iostream> #include<algorithm> #include< ...
- HDU 3899 简单树形DP
题意:一棵树,给出每个点的权值和每条边的长度, 点j到点i的代价为点j的权值乘以连接i和j的边的长度.求点x使得所有点到点x的代价最小,输出 虽然还是不太懂树形DP是什么意思,先把代码贴出来把. 这道 ...
- HDU 4044 GeoDefense
树形DP,和背包差不多.dp[now][x]表示now这个节点的子树上,花费为x的时候,获得的最大防御能力(保证敌方HP<=0) #include<cstdio> #include& ...
随机推荐
- poj3067
求交点的个数: 容易发现,对于两条航线(xi,yi)和(xj,yj),设xi<xj 只有yi>yj时两条航线存在交点: 于是我们考虑以x为第一关键字减序,y为第二关键字为减序排序: 则对于 ...
- 三个流行MySQL分支的对比
MySQL是历史上最受欢迎的免费开源程序之一.它是成千上万个网站的数据库骨干,并且可以将它(和Linux)作为过去10年里Internet呈指数级增长的一个有力证明. 那么,如果MySQL真的这么重要 ...
- [ACdream 1099] 瑶瑶的第K大
瑶瑶的第K大 Time Limit: 4000/2000MS (Java/Others) Memory Limit: 256000/128000KB (Java/Others) Problem Des ...
- webstorm使用教程--主题设置
1. 代码字体设置 :注意需要另存为 Scheme name一个才可以修改Editor Font. 字体设置:Editor->Color & Fonts->Font 2. 界面字体 ...
- apache开源项目--ApacheDS
ApacheDS (Apache Directory Server)的核心是目录服务,可以保存数据,并对不同类型的数据进行搜索操作.协议的实现在目录服务器顶层工作,提供与数据存储.搜索和检索有关的 I ...
- apache开源项目--HBase
HBase – Hadoop Database,是一个高可靠性.高性能.面向列.可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群. HBase是Goog ...
- 【转】JAVA中的反射机制
反射,当时经常听他们说,自己也看过一些资料,也可能在设计模式中使用过,但是感觉对它没有一个较深入的了解,这次重新学习了一下,感觉还行吧! 一,先看一下反射的概念: 主要是指程序可以访问,检测和修改它本 ...
- Android学习过程
0. Tutorial 1. 基础知识的书 2. 实践为主的书 3. 阅读开源项目 4. 自己做项目 5. 理论为主的书 6. 编程规范和技巧性的书 通过实例了解Android开发 组件:Activi ...
- 使用VSS2005的时候报错:输入正确的服务器地址依然出错了
使用VSS2005的时候报错:输入正确的服务器地址依然出错了 使用VSS2005的时候报错: 在安装完vss客户端,进入vss服务器的时候,需要vss服务器的ip和数据库名称.以及初始化文件, 我在进 ...
- [原]《打造未来的Java》视频笔记
[Date]2013-09-28 [Author]wintys (wintys@gmail.com) http://wintys.cnblogs.com [Content]: 1.Java7新特性 1 ...