DotR (Defense of the Robots) Allstars是一个风靡全球的魔兽地图,他的规则简单与同样流行的地图DotA (Defense of the Ancients) Allstars。

DotR里面的英雄只有一个属性——力量。他们需要购买装备来提升自己的力量值,每件装备都可以使佩戴它的英雄的力量值提高固定的点数,所以英雄的力量值等于它购买的所有装备的力量值之和。装备分为基本装备和高级装备两种。基本装备可以直接从商店里面用金币购买,而高级装备需要用基本装备或者较低级的高级装备来合成,合成不需要附加的金币。装备的合成路线可以用一棵树来表示。

比如,Sange and Yasha的合成需要Sange,Yasha和Sange and Yasha Recipe Scroll三样物品。其中Sange又要用Ogre Axe, Belt of Giant Strength和 Sange Recipe Scroll合成。每件基本装备都有数量限制,这限制了你不能无限制地合成某些性价比很高的装备。

现在,英雄Spectre有M个金币,他想用这些钱购买装备使自己的力量值尽量高。你能帮帮他吗?他会教你魔法Haunt(幽灵附体)作为回报的。

Solution

极强的一道树形dp题。

我们设dp[i][j][k]表示当前正在做以i为根的子树,我们需要用j个物品用于向上合成,花费了k元能够获得的最大收益。

首先我们可以递归回溯求出每个点的价格和他的限制购买次数(这个东西是和儿子节点相关的)。

然后就枚举向上传多少个物品,在这里我们记录一个辅助数组g[i][j]表示做到了第i棵子树,背包体积为j时能够获得的最大收益。

但它可能有多个联通块,做完每个子树后我们再把它合并到一个数组里就可以了。

Code

#include<iostream>
#include<cstdio>
#include<cstring>
#define inf 1e9
#define N 55
#define M 2010
using namespace std;
int dp[N][N<<][M],g[N][M],head[N],w[N],va[N],l[N],f[N][M],tot,m,n,ji[N];
struct efr{
int n,to,l;
}an[];
inline void add(int u,int v,int l){
an[++tot].n=head[u];
an[tot].to=v;
an[tot].l=l;
head[u]=tot;
}
void dfs(int u){
if(!head[u]){
l[u]=min(l[u],m/va[u]);//这里求出这件物品的购买限制
for(int i=;i<=l[u];++i)
for(int j=i;j<=l[u];++j)
dp[u][i][j*va[u]]=(j-i)*w[u];//j 表示买了多少个
return;
}
l[u]=inf;
for(int i=head[u];i;i=an[i].n){
int v=an[i].to;
dfs(v);
l[u]=min(l[u],l[v]/an[i].l);//更新l得知
va[u]+=va[v]*an[i].l;//在这里递归计算u的价值
}
l[u]=min(l[u],m/va[u]);
memset(g,-0x3f,sizeof(g));
g[][]=;
for(int o=l[u];o>=;--o){//枚举上传几个
int cnt=;
for(int i=head[u];i;i=an[i].n){
int v=an[i].to;
cnt++;
for(int j=m;j>=;--j)
for(int k=;k<=j;++k)
g[cnt][j]=max(g[cnt][j],g[cnt-][j-k]+dp[v][o*an[i].l][k]);
}
for(int i=;i<=o;++i)
for(int j=;j<=m;++j)
dp[u][i][j]=max(dp[u][i][j],g[cnt][j]+w[u]*(o-i));
}
}
inline char rd(){
char c=getchar();
while(c!='A'&&c!='B')c=getchar();
return c;
}
int main(){
scanf("%d%d",&n,&m);
memset(dp,-0x3f,sizeof(dp));
char c;
for(int i=;i<=n;++i){
scanf("%d",&w[i]);
c=rd();
if(c=='B')scanf("%d%d",&va[i],&l[i]);
else{
int x,y,z;
scanf("%d",&x);
for(int j=;j<=x;++j){
scanf("%d%d",&y,&z);
add(i,y,z);
ji[y]=;
}
}
}
int cnt=;
for(int i=;i<=n;++i)
if(!ji[i]){
dfs(i);
cnt++;
for(int j=;j<=m;++j)
for(int k=;k<=j;++k)
f[cnt][j]=max(f[cnt][j],f[cnt-][j-k]+dp[i][][k]);
}
int ans=;
for(int i=;i<=m;++i)
ans=max(ans,f[cnt][i]);
cout<<ans;
return ;
}

[JSOI2008]魔兽地图(树形dp)的更多相关文章

  1. [luogu4037 JSOI2008] 魔兽地图 (树形dp)

    传送门 Description DotR (Defense of the Robots) Allstars是一个风靡全球的魔兽地图,他的规则简单与同样流行的地图DotA (Defense of the ...

  2. BZOJ.1017.[JSOI2008]魔兽地图(树形DP 背包DP)

    题目链接 树形DP,考虑子节点对父节点的贡献. 设f[x][i][j]表示当前为x,用i个x去合成上一层装备,花费为j的最大价值. 由子节点转移时 是一个分组背包,需要一个辅助数组g[i][j]表示前 ...

  3. bzoj1017 [JSOI2008]魔兽地图DotR——DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1017 好难想的状态啊!f[i][j][k]表示i号物品有j个向上贡献,一共花了k钱的最大力量 ...

  4. [BZOJ1017][JSOI2008]魔兽地图DotR 树形dp

    1017: [JSOI2008]魔兽地图DotR Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 2597  Solved: 1010[Submit][ ...

  5. BZOJ [JSOI2008]魔兽地图DotR

    1017: [JSOI2008]魔兽地图DotR Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 1243  Solved: 532[Submit][S ...

  6. 【bzoj1017】[JSOI2008]魔兽地图DotR

    1017: [JSOI2008]魔兽地图DotR Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 1658  Solved: 755[Submit][S ...

  7. 【BZOJ1017】[JSOI2008]魔兽地图(动态规划)

    [BZOJ1017][JSOI2008]魔兽地图(动态规划) 题面 BZOJ 洛谷 题解 状态设一下,\(f[i][j][k]\)表示第\(i\)个物品,有\(j\)个用于合成,总花费为\(k\)的最 ...

  8. BZOJ1017: [JSOI2008]魔兽地图DotR【树形DP】【玄学】

    Description DotR (Defense of the Robots) Allstars是一个风靡全球的魔兽地图,他的规则简单与同样流行的地图DotA (Defense of the Anc ...

  9. BZOJ1017 [JSOI2008]魔兽地图DotR 【树形dp + 背包dp】

    题目链接 BZOJ1017 题解 orz hzwer 树形dp神题 设\(f[i][j][k]\)表示\(i\)号物品恰好花费\(k\)金币,并将\(j\)个物品贡献给父亲的合成时的最大收益 计算\( ...

随机推荐

  1. pinpoint vs druid

    主流Java数据库连接池分析(C3P0,DBCP,TomcatPool,BoneCP,Druid) - ppjj - 博客园 https://www.cnblogs.com/nizuimeiabc1/ ...

  2. tomcat启动的时候报错Failed to start component

    在idea中运行tomcat时,遇到异常,异常信息如下: 16-Jan-2018 16:33:37.325 信息 [localhost-startStop-1] org.apache.catalina ...

  3. day 7-11 初识MySQL数据库及安装密码设置破解

    一. 什么是数据库 之前所学,数据要永久保存,比如用户注册的用户信息,都是保存于文件中,而文件只能存在于某一台机器上. 如果我们不考虑从文件中读取数据的效率问题,并且假设我们的程序所有的组件都运行在一 ...

  4. systemd取消对服务重启的限制

    默认情况下,一个服务在10秒内最多允许启动5次.当超过5次后,会报如下错误: Job for xx.service failed because start of the service was at ...

  5. mysql 常用字段类型

    tinyint[(m)] [unsigned] [zerofill] 1字节 极小整数,数据类型用于保存一些范围的整数数值范围: 有符号: -128 - 127. 无符号: - 255 特别的: My ...

  6. WPF一步步实现完全无边框自定义Window(附源码)

    在我们设计一个软件的时候,有很多时候我们需要按照美工的设计来重新设计整个版面,这当然包括主窗体,因为WPF为我们提供了强大的模板的特性,这就为我们自定义各种空间提供了可能性,这篇博客主要用来介绍如何自 ...

  7. 异步httpclient(httpasyncclient)的使用与总结

    参考:异步httpclient(httpasyncclient)的使用与总结 1. 前言应用层的网络模型有同步与异步.同步意味当前线程是阻塞的,只有本次请求完成后才能进行下一次请求;异步意味着所有的请 ...

  8. 老男孩python学习自修第十六天【常用模块之sys和os】

    例子: sys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0) sys.version 获取Python解释程序的版本信息 sys. ...

  9. Spring4 MVC Hibernate4 maven集成

    http://www.cnblogs.com/leiOOlei/p/3727859.html

  10. js的常用文档对象,document

    1.document的概念:window的子对象,由于DOM对象模型的默认对象就是window,因此Window对象中的方法和子对象不需要通过Window来引用. - 2.document的组成:属性 ...