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 只好去膜拜题解了……在这里贴两篇泛型背包的文章吧:< ...
随机推荐
- 零基础入门学习Python(10)--列表:一个打了激素的数组
前言 有时候我们需要把一些东西暂时保存起来,因为他们有着一些直接或间接的联系,我们需要把它们放在某个组或者集合中,未来可能用得上. 很多接触过编程的朋友都知道,都接触过数组这个概念,那么数组这个概念事 ...
- Go:struct
一.使用方式 方式3和方式4返回的是:结构体指针,编译器底层对 p.Name 做了转化 *(p).Name,方便程序员使用. type Person struct { Name string Age ...
- selenium切换frame(iframe)
例如网页代码为: <!DOCTYPE html><html lang="en"><head> <meta charset="UT ...
- poj 2186 强连通分量
poj 2186 强连通分量 传送门 Popular Cows Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 33414 Acc ...
- UVa 514 铁轨
题意: #include <bits/stdc++.h> using namespace std; int main() { int n; ]; ; ) { ]) && n ...
- NormalMap 法线贴图
法线贴图+纹理贴图(细节明显) 纹理贴图 法线贴图 法线贴图 存储法线的一张贴图,归一化的法线的 xyz 的值被映射成为对应的 RGB 值.归一化的法线值为[-1,1],RGB的每一个分量为无符号的8 ...
- api安全认证
三.auth自定义授权 客户端代码: import requests import hashlib import time current_time = time.time() #自意义的字符串app ...
- Partitioned Replacement for Cache Memory
In a particular embodiment, a circuit device includes a translation look-aside buffer (TLB) configur ...
- ****使用ftp软件上传下载php文件时换行符丢失bug
在使用ftp软件上传下载php源文件时,我们偶尔会发现在本地windows下notepad++编辑器写好的php文件,在使用ftp上传到linux服务器后,php文件的换行符全部丢失了,导致php文件 ...
- mysql排序关于英文字母abcd..xyz排序。
mysql会自动进行比如pxj,pyj. 再根据p进行排序时候,会自动进行第二个字母的排序 select * from tbl_actor where first_char like 'p%' ord ...