题目描述

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(幽灵附体)作为回报的。

输入输出格式

输入格式:

第一行包含两个整数,N (1 <= n <= 51) 和 m (0 <= m <= 2,000)。分别表示装备的种类数和金币数。装备用1到N的整数编号。

接下来的N行,按照装备1到装备n的顺序,每行描述一种装备。

每一行的第一个非负整数表示这个装备贡献的力量值。

接下来的非空字符表示这种装备是基本装备还是高级装备,A表示高级装备,B表示基本装备。如果是基本装备,紧接着的两个正整数分别表示它的单价(单位为金币)和数量限制(不超过100)。如果是高级装备,后面紧跟着一个正整数C,表示这个高级装备需要C种低级装备。后面的2C个数,依次描述某个低级装备的种类和需要的个数。

输出格式:

第一行包含一个整数S,表示最多可以提升多少点力量值。

输入输出样例

输入样例#1: 复制

10 59

5 A 3 6 1 9 2 10 1

1 B 5 3

1 B 4 3

1 B 2 3

8 A 3 2 1 3 1 7 1

1 B 5 3

5 B 3 3

15 A 3 1 1 5 1 4 1

1 B 3 5

1 B 4 3

输出样例#1: 复制

33


//By Monster_Qi
#include<bits/stdc++.h> using namespace std;
const int MAXM = 2005;
const int MAXN = 55;
const int inf = 0x3f3f3f3f; struct Edge{
int nxt,to,val;
}edge[MAXN*MAXN];
//dp[x][i][j]表示以x为节点,i个用于合成,花费j元的最大收益。
int n,m,head[MAXN],cnt,dp[MAXN][MAXN*2][MAXM];
int L[MAXN],M[MAXN],war[MAXN];
//L[x]表示以x为根的子树最多合成几个,M[x]表示以x为根的子树最大花费。
int ans[MAXM],f[MAXM]; //ans[x]表示花费x元的最大收益,f[x]表示花费x元的局部最大收益。
bool vis[MAXN],used[MAXN]; inline void add(int bg,int ed,int w){
edge[++cnt].to=ed;
edge[cnt].val=w;
edge[cnt].nxt=head[bg];
head[bg]=cnt;
} inline void dfs(int x){
if(vis[x]) return;
vis[x]=1;
if(!head[x]){ //如果为叶节点。
L[x]=min(L[x],m/M[x]);
for(register int i=L[x];i>=0;i--) //枚举几个用来合成。
for(register int j=i;j<=L[x];j++) //枚举一共买了几个。
dp[x][i][M[x]*j]=war[x]*(j-i);
return;
}
L[x]=inf;
for(register int i=head[x];i;i=edge[i].nxt){
int v=edge[i].to;dfs(v);
L[x]=min(L[x],L[v]/edge[i].val);
M[x]+=edge[i].val*M[v];
}
L[x]=min(L[x],m/M[x]); //排除可能因钱不够的影响。
for(register int i=L[x];i>=0;i--){ //枚举买几个此物品。
memset(f,-0x3f,sizeof(f));
f[0]=0;
for(register int u=head[x];u;u=edge[u].nxt){
int v=edge[u].to;
for(register int j=m;j>=0;j--){ //枚举一共的花费。
int sum=-inf;
for(register int k=0;k<=j;k++){ //枚举以v为根的子树的花费。
sum=max(sum,f[j-k]+dp[v][edge[u].val*i][k]);
//其他物品的收益加上以v为根的子树的最大花费。
f[j]=sum;
}
}
}
for(register int j=0;j<=i;j++) //枚举有几个用来合成。
for(register int k=0;k<=m;k++) //枚举花费多少。
dp[x][j][k]=max(dp[x][j][k],f[k]+war[x]*(i-j));
}
} int main(){
scanf("%d%d",&n,&m);
memset(dp,-0x3f,sizeof(dp));
for(register int i=1;i<=n;i++){
scanf("%d",&war[i]);
char c;
cin>>c;
// cout<<c<<endl;
if(c=='B')
scanf("%d%d",&M[i],&L[i]);
else{
int nn;
scanf("%d",&nn);
for(register int j=1;j<=nn;j++){
int a,b;
scanf("%d%d",&a,&b);
add(i,a,b);
used[a]=1;
}
}
}
// for(register int i=1;i<=n;i++) cout<<used[i]<<endl;
for(register int i=1;i<=n;i++)
if(!used[i]){
dfs(i);
for(register int j=m;j>=0;j--) //枚举总共花了多少钱。
for(register int k=0;k<=j;k++) //枚举以i为根的子树的花费。
ans[j]=max(ans[j],ans[j-k]+dp[i][0][k]);
}
// for(register int i=1;i<=m;i++) cout<<ans[i]<<endl;
printf("%d\n",ans[m]);
return 0;
}

JSOI 2008 魔兽地图的更多相关文章

  1. JSOI 2008 【魔兽地图】

    其实这题是我从noip前就开始做的...那个时候打的Pascal,一直TLE,转了C++之后我又写了一遍,A了... 辛酸史:                      题目描述: DotR (Def ...

  2. 【BZOJ-1017】魔兽地图DotR 树形DP + 背包

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

  3. 1017: [JSOI2008]魔兽地图DotR - BZOJ

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

  4. BZOJ 1017 魔兽地图

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

  5. BZOJ [JSOI2008]魔兽地图DotR

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

  6. 【百度地图API】如何制作一张魔兽地图!!——CS地图也可以,哈哈哈

    原文:[百度地图API]如何制作一张魔兽地图!!--CS地图也可以,哈哈哈 摘要: 你玩魔兽不?你知道如何做一张魔兽地图不?! 快来看此文吧! ---------------------------- ...

  7. [BZOJ]1017 魔兽地图DotR(JSOI2008)

    BZOJ第一页做着做着就能碰到毒题,做到BZOJ1082小C就忍了,没想到下一题就是这种东西.这种题目不拖出来枭首示众怎么对得起小C流逝的青春啊. Description DotR (Defense ...

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

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

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

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

随机推荐

  1. vs2013 命名空间“Microsoft.Office”中不存在类型或命名空间名称“Interop”。是否缺少程序集引用?

    参考博文: 解决办法:添加引用/com/Microsoft Office 11.0 Object Library 然后在程序中 C#代码 using Microsoft.Office.Interop. ...

  2. 图(graph)

    一.非线性结构:图 图由顶点集V,集合规模为n,在n个顶点之间可能存在对应关系,我们用连边来描述这种,即边E,规模为e. 邻接关系:顶点与顶点之间的关系:关联关系:顶点与它相连的边的关系.序列结构(v ...

  3. Python 分布式锁

    1,数据一致性 当多个进程/线程对同一个共享资源读写,会因为资源的争夺而出现混乱,导致数据不一致. 如下图: 在数据库的原始数据是 d0,上图的处理流程如下: t1 时刻,有两个数据源的数据 d1,d ...

  4. 一起看下Apache1.3.22版本改进和修正了啥?

    Apache 1.3.20 - 1.3.22主要改进: 安全弱点: 1.在Apache1.3.20的win32平台上发现了一个漏洞.如果客户端发送一个非常长的URI可能导致用目录列表来代替缺省主页.4 ...

  5. delphi 获得系统目录

    利用Api函数,现在我介绍两个Api函数,利用他们就可以轻松简单的获取这些特殊系统目录. Function SHGetSpecialFolderLocation(hwndOwner: HWND; nF ...

  6. 干货满满!解密阿里云RPA (机器人流程自动化)的产品架构和商业化发展

    阿里云RPA,作为阿里云自研8年的技术,在资本的热捧下,逐渐从幕后来到台前,成为企业服务市场的黑马.本文将从产品上全面剖析,阿里云RPA这款产品的现阶段情况,同时简单谈谈阿里云RPA的商业化进展. 阿 ...

  7. Java中的线程Thread方法之---interrupt()

    前几篇都介绍了Thread中的几个方法,相信大家都发现一个相似点,那就是sleep,join,wait这样的阻塞方法都必须捕获一个InterruptedException异常,顾名思义就是一个线程中断 ...

  8. NX二次开发-UFUN创建块UF_MODL_create_block

    NX9+VS2012 #include <uf.h> #include <uf_modl.h> UF_initialize(); UF_FEATURE_SIGN Sign = ...

  9. [转]C# JSON格式的字符串读取到类中

    将JSON格式的字符串读取到类中 本例中建立JSON格式的字符串json,将其内容读取到Person类中 运行本代码需要添加引用动态库Newtonsoft.Json 程序代码: using Syste ...

  10. sql基础学习

    学习参考网站:http://www.runoob.com/sql/sql-tutorial.html 一.SQL命令 1.SELECT 语句 用于从数据库中选取数据. select column_na ...