hdu 4044 GeoDefense (树形dp | 多叉树转二叉树)
来源:互联网 发布:淘宝视频取消自动播放 编辑:程序博客网 时间:2024/05/22 10:57
本文出自 http://blog.csdn.net/shuangde800
题目链接: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 | 多叉树转二叉树)
- hdu 4044 GeoDefense(DP-树形DP)
- hdu 4044 GeoDefense (树形dp+01背包)
- HDU 4044 GeoDefense(树形DP+分组背包)★
- HDU 4044 GeoDefense(树形DP+分组背包)
- hdu 4044 GeoDefense 树形dp+分组背包
- hdu 4044 GeoDefense 树形dp+分组背包
- HDU 4044 GeoDefense 树形DP+分组背包
- hdu 4044 GeoDefense 树形DP+分组背包
- HDU 4044 GeoDefense(树形dp+分组背包)
- HDU 4044 GeoDefense 树形dp:树形背包★
- HDU ACM 4044 GeoDefense ->树形DP+分组背包
- hdu4044 GeoDefense 树形dp
- HDU4044 GeoDefense 树形dp
- HDOJ 4044 - GeoDefense 树形DP..泛化背包转移..
- HDU 4044 GeoDefense(动态规划)
- hdu 4044 GeoDefense
- hdu 4044 GeoDefense
- Android的触摸(Touch)机制
- linux 线程
- java定时器,在web工程中执行
- ScrollView中添加一个android:fillViewport="true"
- std string的内存共享和Copy-On-Write技术
- hdu 4044 GeoDefense (树形dp | 多叉树转二叉树)
- Lambda 表达式
- centos vsftp
- OFBIZ研究心得之三
- jar打包 jar line too long 异常处理方法
- 64位linux下安装oracle10 64位 遇到 :ins_ctx.mk ;ins_emdb.mk
- POJ 2479 Maximum sum (DP&双最大子段和)
- 面试百题001——谈谈你对面向对象编程的认识
- 常用WebServices 天气,IP,邮编,Email,火车时刻表,股票 web接口服务