bzoj 1017 魔兽地图DotR
题目大意:
他们需要购买装备来提升自己的力量值,每件装备都可以使佩戴它的英雄的力量值提高固定的点数,所以英雄的力量值等于它购买的所有装备的力量值之和。装备分为基本装备和高级装备两种。基本装备可以直接从商店里面用金币购买,而高级装备需要用基本装备或者较低级的高级装备来合成,合成不需要附加的金币。装备的合成路线可以用一棵树来表示。比如,Sange and Yasha的合成需要Sange,Yasha和Sange and Yasha Recipe Scroll三样物品。其中Sange又要用Ogre Axe, Belt of Giant Strength和 Sange Recipe Scroll合成。每件基本装备都有数量限制,这限制了你不能无限制地合成某些性价比很高的装备。现在,英雄Spectre有M个金币,他想用这些钱购买装备使自己的力量值尽量高。
已知每个高级装备需要哪些初级下一级装备以及需要几个
思路:
树形dp
dp i j k表示第i种装备,有j个用于合成上一级装备,花k个金币
首先可以得到整个图应该是很多树
然后对于每个节点,我们都可以根据它的子树推出来
f[i][j][k]=max{c[i][k]+v[i]*(t-j)}
然后我们枚举这个节点有多少个需要用于合成(需要倒序枚举 不然爆炸)
最后对于每棵树
我们可以枚举钱数,来求出这棵树买多少
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<stack>
#define inf 2147483611
#define ll long long
#define MAXN 55
using namespace std;
inline int read()
{
int x=,f=;
char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-;ch=getchar();}
while(isdigit(ch)) {x=x*+ch-'';ch=getchar();}
return x*f;
}
int n,m,v[MAXN],cst[MAXN],lim[MAXN];
int cnt,to[MAXN*MAXN*],val[MAXN*MAXN*],first[MAXN],next[*MAXN*MAXN],ind[MAXN];//邻接表
int f[MAXN][MAXN*][MAXN*],c[MAXN][MAXN*],res[MAXN][MAXN*];
//f为dp数组 c记录某节点前x个子树花j个金币所获得最大收益 res记录前k棵树花j个金币获得最大收益
void add(int u,int v,int d) {next[++cnt]=first[u],first[u]=cnt,val[cnt]=d,to[cnt]=v,ind[v]++;}
void dp(int x)
{
if(!first[x])
{
lim[x]=min(lim[x],m/cst[x]);
for(int i=;i<=lim[x];i++)
for(int j=i;j<=lim[x];j++)
f[x][i][j*cst[x]]=v[x]*(j-i);
return ;
}
lim[x]=inf;
for(int i=first[x];i;i=next[i])
{
dp(to[i]);
lim[x]=min(lim[x],lim[to[i]]/val[i]);
cst[x]+=val[i]*cst[to[i]];
}
lim[x]=min(lim[x],m/cst[x]);
memset(c,-0x3f3f3f3f,sizeof(c));
c[][]=;
int cntt;
for(int t=lim[x];t>=;t--)
{
cntt=;
for(int i=first[x];i;i=next[i])
{
cntt++;
for(int j=;j<=m;j++)
for(int k=;k<=j;k++)
c[cntt][j]=max(c[cntt][j],c[cntt-][j-k]+f[to[i]][t*val[i]][k]);
}
for(int i=;i<=t;i++)
for(int j=;j<=m;j++)
f[x][i][j]=max(f[x][i][j],c[cntt][j]+(t-i)*v[x]);
}
}
int main()
{
memset(f,-0x3f3f3f3f,sizeof(f));
n=read(),m=read();
char ch[];int x,b,a,ans=;
for(int i=;i<=n;i++)
{
v[i]=read();
scanf("%s",ch);
if(ch[]=='A')
{
x=read();
for(int j=;j<=x;j++) {a=read(),b=read();add(i,a,b);}
}
else cst[i]=read(),lim[i]=read();
}
cnt=;
for(int g=;g<=n;g++)
{
if(!ind[g])
{
dp(g);
cnt++;
for(int i=;i<=m;i++)
for(int j=;j<=i;j++)
for(int k=;k<=lim[g];k++)
res[cnt][i]=max(res[cnt][i],res[cnt-][j]+f[g][k][i-j]);
}
}
for(int i=;i<=m;i++) ans=max(ans,res[cnt][i]);
printf("%d",ans);
}
orz vfk大佬速度惊人,博客太长了懒得看
bzoj 1017 魔兽地图DotR的更多相关文章
- [BZOJ]1017 魔兽地图DotR(JSOI2008)
BZOJ第一页做着做着就能碰到毒题,做到BZOJ1082小C就忍了,没想到下一题就是这种东西.这种题目不拖出来枭首示众怎么对得起小C流逝的青春啊. Description DotR (Defense ...
- BZOJ 1017 魔兽地图DotR(树形DP)
题意:有两类装备,高级装备A和基础装备B.现在有m的钱.每种B有一个单价和可以购买的数量上限.每个Ai可以由Ci种其他物品合成,给出Ci种其他物品每种需要的数量.每个装备有一个贡献值.求最大的贡献值. ...
- BZOJ [JSOI2008]魔兽地图DotR
1017: [JSOI2008]魔兽地图DotR Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 1243 Solved: 532[Submit][S ...
- BZOJ 1017 魔兽地图
Description DotR (Defense of the Robots) Allstars是一个风靡全球的魔兽地图,他的规则简单与同样流行的地图DotA (Defense of the Anc ...
- 【BZOJ-1017】魔兽地图DotR 树形DP + 背包
1017: [JSOI2008]魔兽地图DotR Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 1566 Solved: 705[Submit][S ...
- 【bzoj1017】[JSOI2008]魔兽地图DotR
1017: [JSOI2008]魔兽地图DotR Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 1658 Solved: 755[Submit][S ...
- [BZOJ1017][JSOI2008]魔兽地图DotR 树形dp
1017: [JSOI2008]魔兽地图DotR Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 2597 Solved: 1010[Submit][ ...
- 1017: [JSOI2008]魔兽地图DotR - BZOJ
Description DotR (Defense of the Robots) Allstars是一个风靡全球的魔兽地图,他的规则简单与同样流行的地图DotA (Defense of the Anc ...
- 【BZOJ】【1017】【JSOI2008】魔兽地图Dotr
树形DP 一开始想:f[i][j]表示以 i 为根的子树,花 j 块钱能得到的最高力量值,结果发现转移的时候没法保证叶子结点的数量限制TAT 只好去膜拜题解了……在这里贴两篇泛型背包的文章吧:< ...
随机推荐
- 开发基本的php框架
github路径:https://github.com/zhengchuzhou/easyPhpFramework 一.目录结构及用途 二.相关代码: 1.入口文件(index.php): <? ...
- Ubuntu终端常用快捷键汇总
Ubuntu终端常用的快捷键 - 转自- 博客园 http://www.cnblogs.com/nucdy/p/5251659.html Ubuntu中的许多操作在终端(Terminal)中十分 ...
- echarts的简单应用之(一)柱形图
前段时间做项目需要绘制一些图表来展示信息,从网上资料来看用的比较多的是百度开源的echarts.echarts的官网上有API以及demo.上面的图形都是非常炫的,不过都是静态 数据,我们做项目时不可 ...
- POJ 3469 网络流最小割
将两个CPU分别视作源点和汇点 对于那些不在同一个CPU中的模块会产生的代价作为一条双向的容量弧 这里每个模块可以在任意一个CPU中运行,相当于寻找一个割,分割后,在S集合中的模块安装在第一个CPU中 ...
- bzoj 1413 [ZJOI2009]取石子游戏
1413: [ZJOI2009]取石子游戏 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 747 Solved: 490[Submit][Statu ...
- PHP $_SERVER的使用
常常会用到php的$_SERVER变量,可是好多常用的参数又不熟每次都去查手册.为了记住一些常用的,写个日志吧.前导:网站根目录:/www/domain.com/访问Url:http://www.do ...
- Xterm256终端颜色的名称
hi x016_Grey0 ctermfg=16 guifg=#000000 "rgb=0,0,0 hi x017_NavyBlue ctermfg=17 guifg=#00005f &qu ...
- 百度音乐免费API接口
音乐分类: 1.新歌榜,2.热歌榜,11.摇滚榜,12.爵士,16.流行21.欧美金曲榜,22.经典老歌榜,23.情歌对唱榜,24.影视金曲榜,25.网络歌曲榜 说明:百度music web版全接口h ...
- JavaWeb图片显示与存储
在数据库中存储文件的名称,在存储信息资料里面存下照片,利用文件名称. 代码如下: 其中iamgeFile为 图片存储的路径userImages/ Resultuser.setImageName(Pro ...
- [bzoj2208][Jsoi2010]连通数_bitset_传递闭包floyd
连通数 bzoj-2208 Jsoi-2010 题目大意:给定一个n个节点的有向图,问每个节点可以到达的点的个数和. 注释:$1\le n\le 2000$. 想法:网上有好多tarjan+拓扑序dp ...