技能树(SGOI)
skill.pas/c/cpp
【问题描述】
玩过 Diablo 的人对技能树一定是很熟悉的。一颗技能树的每个结点都是一项技能,要学会这项技能则需
要耗费一定的技能点数。只有在学会了某一项技能以后,才能继续学习它的后继技能。每项技能又有着不同的级
别,级别越高效果越好,而技能的升级也是需要耗费技能点数的。
有个玩家积攒了一定的技能点数,他想尽可能地利用这些技能点数来达到最好的效果,因此他给所有技能的
所有级别都打上了分,他认为效果越好的则分数越高。现在他要你帮忙寻找一个分配技能点数的方案,使得分数
总和最高。
【输入格式】
第一行是一个整数 n(1<=n<=20),表示所有不同技能的总数。接下来依次给出了这 n 个不同技能的详细
描述。每个技能描述共包括 5 行,第一行是该技能的名称,第二行是该技能在技能树中的父技能的名称,为空
则表示该技能不需要任何的先修技能便能学习。第三行是一个整数 L(1<=L<=20) ,表示这项技能所拥有的最
高等级。第四行共有 L 个整数,其中第 i 个整数表示把这项技能从第 i-1 级升到第 i 级所需要的技能点数(0
级表示没有学习过)。第五行也包括了 L 个整数,其中第 i个整数表示该玩家对这项技能的第 i 级的效果评分,
分数不超过 20。在技能描述之后是玩家所用角色的描述,共有两行。第一行是一个整数 P(0<=P<=100),表
示目前所拥有的技能点数。接下来一行是 n 个整数,依次表示角色当前所习得的技能级别,0 表示尚未学习。这里

不会出现非法的情况,譬如在没有学习某项技能的时候已经习得了它的后继技能。
【输出格式】
只需包括一个整数 S,表示你的技能点最佳分配方案所得到的分数总和。
【输入样例】
3
Freezing Arrow
Ice Arrow
3
3 3 3
15 4 6
Ice Arrow
Cold Arrow
2
4 3
10 17
Cold Arrow
 
3
3 3 2
15 5 2
10
0 0 1
【输出样例】
42
【时间限制】
1s
【空间限制】
64M

//------------------------------------------------------------------------------------------------

分析:树形动规,多叉树转二叉树.

f[i,j]表示以i为根的子树,花j点技能点,能得到的最大分数.

枚举给左右儿子分配的点数进行转移,记忆化搜索.

code:

type  skill=recordn,f:string;l:longint;v,p:array[0..21] of longint;
end;
const maxn=21;maxp=101;
var   s:array[0..maxn] of skill;f:array[0..maxn,0..maxp] of longint;learn,l,r:array[0..maxn] of longint;n,i,j,fa,tmp,p,ans:longint;function find(st:string):longint;var   o:longint;beginfor o:=1 to n doif s[o].n=st then exit(o);exit(0);end;function maxx(a,b:longint):longint;beginif a>b then exit(a); exit(b);end;function DP(t,m:longint):longint;var   max,now,o,cost,value,q:longint;beginif f[t,m]>=0 then exit(f[t,m]);max:=DP(r[t],m);  //不学这种技能if learn[t]>0 then  //已经学过的话,向下接着学for o:=1 to m dobeginnow:=DP(l[t],o)+DP(r[t],m-o);max:=maxx(max,now);end;cost:=0;value:=0;for o:=learn[t]+1 to s[t].l do  //把这个技能接着学下去begincost:=cost+s[t].v[o];value:=value+s[t].p[o];for q:=0 to m-cost dobeginnow:=DP(l[t],q)+DP(r[t],m-cost-q)+value;max:=maxx(max,now);end;end;f[t,m]:=max;exit(max);end;beginassign(input,'skill.in'); reset(input);assign(output,'skill.out'); rewrite(output);readln(n);for i:=1 to n dobeginreadln(s[i].n);readln(s[i].f);readln(s[i].l);for j:=1 to s[i].l do read(s[i].v[j]);readln;for j:=1 to s[i].l do read(s[i].p[j]);readln;end;readln(P);for i:=1 to n do read(learn[i]);for i:=1 to n dobeginfa:=find(s[i].f);if l[fa]=0 then l[fa]:=ielsebegintmp:=l[fa];while r[tmp]<>0 do tmp:=r[tmp];r[tmp]:=i;end;end;fillchar(f,sizeof(f),255);for i:=0 to maxp do f[0,i]:=0;ans:=DP(l[0],P);writeln(ans);close(input);close(output);
end.

转载于:https://www.cnblogs.com/exponent/archive/2011/08/06/2129483.html

树形动规_(技能树)相关推荐

  1. 树形动规_(战略游戏)

    战略游戏(SGOI) stragedi.pas/c/cpp [问题描述]    Bob 喜欢玩电脑游戏,特别是战略游戏.但是他经常无法找到快速玩过游戏的办法.现在他有个问题.他要 建立一个古城堡,城堡 ...

  2. BTTCOJ 问题 G: 逃离地牢 树形动规

    题目描述 小明明又被大威鱼抓住了,大威鱼把小明明关在地牢里,地牢由n * n 个房间组成,小明被困在地牢的最左上角的房间中,出口在最右下角,他想逃出这个诡异的地牢,但是他只能向下或者向右走. 小明每经 ...

  3. P2014 选课 (树形动规)

    题目描述 在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习.现在有N门功课,每门课有个学分,每门课有一 ...

  4. 状压动规_(POJ2817)

    题意:给出N(N<=10)个字符串(length<=10),定义两个串a,b之间的公共序列长度为 将a,b对齐后,相同位置上相同字母的个数,a,b的最长公共序列长度自然是相同字母数的 最大 ...

  5. 关于数位动规(入门到进阶,难度中档)

    数位动规,就是对于数位进行动规(日常一句废话···) 刚好今天听数位dp,就总结一下最近写的题吧.郭神说要学懂数位dp,还是要搞懂它内部是怎么工作的.比如一个有大小的数,我们在这里剥夺它作为一个整数的 ...

  6. CF2B The least round way(贪心+动规)

    题目 CF2B The least round way 做法 后面\(0\)的个数,\(2\)和\(5\)是\(10\)分解质因数 则把方格中的每个数分解成\(2\)和\(5\),对\(2\)和\(5 ...

  7. 正则表达式匹配(动规)

    文章目录 题目 思路 转移方程 特征 再探 i 和 j 代码 题目 请实现一个函数用来匹配包含 . 和 * 的正则表达式.模式中的字符 . 表示任意一个字符,而 * 表示它前面的字符可以出现任意次(含 ...

  8. 洛谷 P1073 最优贸易 (分层图状态转移+SPFA,求最长路径;另附某dalao的超短代码:暴力+动规)

    题目链接1 题目链接2 另附某dalao的超短代码:暴力+动规 P1073 最优贸易 题目描述 C国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市. 任意两个城市之间最多只有 ...

  9. leetcode 121. 买卖股票的最佳时机 (贪心 + 动规 + 双指针

    贪心的思路: 得到最小值,再挨个用数组中的值减去最小值,最终值取一个最大的 class Solution { public:int maxProfit(vector<int>& p ...

最新文章

  1. 逻辑回归:确定一个人是否年收入超过5万美元
  2. 特征选择过滤法之方差选择、双样本t检验、方差分析、相关系数法、卡方检验、互信息法
  3. Redis中的客户端重定向
  4. spring roo_使用Spring Roo进行快速云开发–第1部分:Google App Engine(GAE)
  5. Python变量类型
  6. IntelliJ IDEA 2019 安装lombok
  7. c语言编程从键盘上输入两个整数m和n,C语言习题 求键盘输入的两个正整数的最大公约数和最小公倍数...
  8. swift 拖动按钮_Swift 简单控件示例:滑块(UISlider)
  9. IOCP Thread Pool 在 C# 的Safe实现
  10. 换种思路去理解设计模式(上)
  11. [转]winform控件webbrowser和js脚本互调
  12. django 之模板层
  13. javaWeb新闻管理系统
  14. gmail无法登陆的解决!!
  15. eviews做回归分析时输出值的理解
  16. 使用Apple设备的看过来,你的Apple账户为什么莫名其妙地被扣款!
  17. PHP获取客户端真实IP的方法
  18. Linux笔记 No.22---(Linux - PAM)
  19. STM32 四轴无人机的设计——基于HCSR04超声波模块的距离检测与警报设计
  20. Task3 | HLM | 高收入个体更吝啬吗

热门文章

  1. python八大选择排序_python之八大排序方法
  2. mysql 数据库还原 不齐_请教mysql数据库还原问题。
  3. quartz定时器依赖_JAVA使用quartz添加定时任务,并依赖注入对象操作
  4. Java生鲜电商平台-深入订单拆单架构与实战
  5. 洛谷模板,树状数组二 差分
  6. python 课堂笔记-for语句
  7. 怎样在CentOS 7.0上安装和配置VNC服务器
  8. Ubuntu DNS bind9 配置
  9. Perl 面对对象的案例理解
  10. SQL登录 18470 18452 错误