bzoj1017(JSOI2008)魔兽地图
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1017
钱数很少,所以它也能压进状态里。
还有向上贡献几个物品。所以状态就是第 i 号物品,向上贡献 j 个,总共花 k 元的当前就能得到的力量。
然后可以树形dp。
不同的是平常的树形dp,该点的值就顺便充当前 r 个子树的值;遍历完子树就完成自己的值。
但这里的状态里有一个“向上贡献 j 个”,不太好弄。所以另开一个 g ,只关注花了多少钱和带来多少力量。
为了能用这个g转移到dp,不出现花了某些钱其实买不够向上贡献的 j 个当前物品的情况,应该把“总共买 l 个当前物品”放在最外面枚举。
并且是倒序,为了沿用上一轮的g值。
**不知为何,自己的代码比别人慢了好多!!我觉得没什么不同呀……以后再来看看吧。
#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
const int N=,M=;const ll INF=0x7fffffff;
int n,m,head[N],xnt,du[N];
ll a[N],L[N],c[N],dp[N][N<<][M],g[N][M],h[N][M],ans;//dp[][N<<1][]不能dp[][N][]
struct Edge{
int next,to;ll w;
Edge(int n=,int t=,ll w=):next(n),to(t),w(w) {}
}edge[N];
void dfs(int cr)
{
if(!head[cr])
{
L[cr]=min(L[cr],m/c[cr]);
for(int i=;i<=L[cr];i++)
for(int j=;j<=i;j++)
dp[cr][j][i*c[cr]]=(i-j)*a[cr];
return;
}
L[cr]=INF;
for(int i=head[cr],v;i;i=edge[i].next)
{
dfs(v=edge[i].to);L[cr]=min(L[cr],L[v]/edge[i].w);
c[cr]+=c[v]*edge[i].w; //只是用来限制L[cr]
}
L[cr]=min(L[cr],m/c[cr]);
memset(g,-,sizeof g);//g只和子树阶段、钱有关,因为dp涉及"向上贡献几个",所以不方便同时表示前几个子树的力量值
g[][]=;
for(int l=L[cr];l>=;l--)//g不重赋值,所代表的状态应该足以合成当前的l个当前装备;所以需倒序
{
int tot=;
for(int i=head[cr];i;i=edge[i].next)
{
tot++;
for(int k=;k<=m;k++)//用了k钱
for(int j=;j<=k;j++)//j钱给v
g[tot][k]=max(g[tot][k],g[tot-][k-j]+dp[edge[i].to][l*edge[i].w][j]);//k-j钱给之前的子树
}
for(int j=;j<=l;j++)
for(int k=;k<=m;k++)
dp[cr][j][k]=max(dp[cr][j][k],g[tot][k]+a[cr]*(l-j));//子树们的节余+自己的节余
}
}
int main()
{
scanf("%d%d",&n,&m);char ch;int u,x;ll z;
memset(L,,sizeof L);
memset(dp,-,sizeof dp);//////
for(int i=;i<=n;i++)
{
scanf("%lld %c",&a[i],&ch);
if(ch=='B')
{
scanf("%lld%lld",&c[i],&L[i]);
}
else
{
scanf("%d",&u);
for(int j=;j<=u;j++)
{
scanf("%d%lld",&x,&z);
edge[++xnt]=Edge(head[i],x,z);head[i]=xnt;du[x]++;
}
}
}
int tot=;
for(int i=;i<=n;i++)
if(!du[i])
{
dfs(i);tot++;
for(int k=;k<=m;k++)//总共
for(int j=;j<=m;j++)//给之前的树
h[tot][k]=max(h[tot][k],h[tot-][j]+dp[i][][k-j]);
}
for(int i=;i<=m;i++)ans=max(ans,h[tot][i]);
printf("%lld",ans);
return ;
}
bzoj1017(JSOI2008)魔兽地图的更多相关文章
- [BZOJ1017][JSOI2008]魔兽地图DotR 树形dp
1017: [JSOI2008]魔兽地图DotR Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 2597 Solved: 1010[Submit][ ...
- [bzoj1017][JSOI2008]魔兽地图 DotR (Tree DP)【有待优化】
Description DotR (Defense of the Robots) Allstars是一个风靡全球的魔兽地图,他的规则简单与同样流行的地图DotA (Defense of the Anc ...
- BZOJ1017: [JSOI2008]魔兽地图DotR【树形DP】【玄学】
Description DotR (Defense of the Robots) Allstars是一个风靡全球的魔兽地图,他的规则简单与同样流行的地图DotA (Defense of the Anc ...
- BZOJ1017 [JSOI2008]魔兽地图DotR 【树形dp + 背包dp】
题目链接 BZOJ1017 题解 orz hzwer 树形dp神题 设\(f[i][j][k]\)表示\(i\)号物品恰好花费\(k\)金币,并将\(j\)个物品贡献给父亲的合成时的最大收益 计算\( ...
- BZOJ1017: [JSOI2008]魔兽地图DotR
传送门 设$f[i][j][k]$表示对于第$i$个点,向父节点贡献$j$个已合成的装备,花费了$k$的代价,最多获得的力量值. 单纯的$f[i][j][k]$是很难转移的,主要原因是无法维护和其他儿 ...
- bzoj1017 [JSOI2008]魔兽地图DotR——DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1017 好难想的状态啊!f[i][j][k]表示i号物品有j个向上贡献,一共花了k钱的最大力量 ...
- 【BZOJ1017】[JSOI2008]魔兽地图(动态规划)
[BZOJ1017][JSOI2008]魔兽地图(动态规划) 题面 BZOJ 洛谷 题解 状态设一下,\(f[i][j][k]\)表示第\(i\)个物品,有\(j\)个用于合成,总花费为\(k\)的最 ...
- 【bzoj1017】[JSOI2008]魔兽地图DotR
1017: [JSOI2008]魔兽地图DotR Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 1658 Solved: 755[Submit][S ...
- 【BZOJ-1017】魔兽地图DotR 树形DP + 背包
1017: [JSOI2008]魔兽地图DotR Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 1566 Solved: 705[Submit][S ...
随机推荐
- c++复习要点
自增和自减运算符有前缀和后缀两种形式,都会改变对象,所以不能对常量对象操作. 前缀形式返回改变后的对象,返回*this. 后缀形式返回改变之前的值,所以必须创建一个代表这个值的独立对象并返回它,是通过 ...
- 浅谈HTML中的块级元素和内联元素
一.基本概念 1.块级元素(block element):一般都从新行开始占据一定的矩形空间,可以设置其宽.高属性来改变矩形的大小.一般情况下块级元素可以包含内联元素和其它块级元素,但也有特殊如for ...
- Java复习6异常处理
Java复习6.异常处理 20131005 前言: Java中的异常处理机制是非常强大的,相比C++ 来说,更加系统.但是我们开发人员没有很好的使用这一点.一些小的程序是没有什么问题的,但是对于大型项 ...
- vue 自定义拖拽指令
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- iOS如何直接跳转到App Store
在iOS应用中如何直接跳转到AppStore里面?其实这个问题很简单,首先拿到你要跳转到的AppStore地址(URL) 例如:https://itunes.apple.com/us/app/中久便利 ...
- 手机微信网站开发放弃windows phone的理由
1.手机操作系统市场份额: 全球(2.44% 下滑): http://news.mydrivers.com/1/449/449736.htm 中国(1% 下滑): http://app.techweb ...
- oracle和sql server 比较
Oracle SQLServer 比较 字符数据类型 CHAR CHAR 都是固定长度字符资料但oracle里面最大度为2kb,SQLServer里面最大长度为8kb 变长字符数据类型 ...
- 【转】react-native开发混合App-github开源项目
http://www.lcode.org/study-react-native-opensource-one/ http://gold.xitu.io/entry/575f498c128fe10057 ...
- 使用nrm管理npm仓库
使用nrm管理npm仓库 用npm装包的时候,经常碰到太慢或者npm官网被墙的情况,有时候凑合一下就改一下 "~/.npmrc" 文件,但是经常改来改去也挺麻烦的,于是找到了可以使 ...
- Vim技能修炼教程(3) - 语法高亮进阶
语法高亮进阶 首先我们复习一下上节学到的三个命令: * syntax match用于定义正则表达式和规则的对应 * highlight default定义配色方案 * highlight link将正 ...