bzoj1017 [JSOI2008]魔兽地图DotR——DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1017
好难想的状态啊!f[i][j][k]表示i号物品有j个向上贡献,一共花了k钱的最大力量;
g[i][j]用在子树中,表示前i个子树花j钱的最大值;
调了半上午,终于发现原来是少看了一个范围,f的第二维的范围不是51而是100啊啊啊啊啊啊!
除此之外此题也有很多要注意的地方,写在注释里了。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int const maxn=,maxm=,inf=;
int n,m,L[maxn],M[maxn],P[maxn],head[maxn],ct;
int f[maxn][maxn<<][maxm],g[maxn][maxm],rd[maxn],h[maxn][maxm];
struct N{
int to,next,w;
N(int t=,int n=,int w=):to(t),next(n),w(w) {}
}edge[];
void dp(int x)
{
if(!head[x])//叶子
{
L[x]=min(L[x],m/M[x]);//!
for(int i=;i<=L[x];i++)//有i个
for(int j=;j<=i;j++)//贡献j个
f[x][j][M[x]*i]=P[x]*(i-j);
return;//!!!!!!!!!!
}
L[x]=inf;//!高级装备原本没有限制
for(int i=head[x],u;i;i=edge[i].next)
{
u=edge[i].to;
dp(u);
L[x]=min(L[x],L[u]/edge[i].w);
M[x]+=M[u]*edge[i].w;//
}
L[x]=min(L[x],m/M[x]);
memset(g,-0x3f,sizeof g);//!!
g[][]=;//!!
for(int l=L[x];l>=;l--)//x物品有l个 //倒序! //l可以有0个!!!!!!!!!!!
{
int tot=;
// memset(g,0,sizeof g);//放在外面!
for(int i=head[x],v;i;i=edge[i].next)
{
v=edge[i].to;
tot++;
for(int j=;j<=m;j++)//一共有j钱
for(int k=;k<=j;k++)//给v k钱
g[tot][j]=max(g[tot][j],g[tot-][j-k]+f[v][l*edge[i].w][k]);
//g每次不会重新赋初值,所以需要l倒序来保证本次一定可以合成l个x物品
}
for(int j=;j<=l;j++)
for(int k=;k<=m;k++)
f[x][j][k]=max(f[x][j][k],g[tot][k]+P[x]*(l-j));
}
}
int main()
{
scanf("%d%d",&n,&m);
char dc;
// memset(L,0x3f,sizeof L);
memset(f,-0x3f3f3f3f,sizeof f);
for(int i=,x,a,b;i<=n;i++)
{
scanf("%d",&P[i]);
cin>>dc;
if(dc=='A')
{
scanf("%d",&x);
while(x--)
{
scanf("%d%d",&a,&b);
edge[++ct]=N(a,head[i],b);head[i]=ct;
rd[a]++;
}
}
else scanf("%d%d",&M[i],&L[i]);
}
int tot=;
for(int i=;i<=n;i++)
if(!rd[i])
{
tot++;
dp(i);
for(int j=;j<=m;j++)
for(int k=;k<=j;k++)
for(int l=;l<=L[i];l++)
h[tot][j]=max(h[tot][j],h[tot-][k]+f[i][l][j-k]);
}
int ans=;
for(int j=;j<=m;j++)ans=max(ans,h[tot][j]);
printf("%d\n",ans);
return ;
}
bzoj1017 [JSOI2008]魔兽地图DotR——DP的更多相关文章
- [BZOJ1017][JSOI2008]魔兽地图DotR 树形dp
1017: [JSOI2008]魔兽地图DotR Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 2597 Solved: 1010[Submit][ ...
- BZOJ1017: [JSOI2008]魔兽地图DotR【树形DP】【玄学】
Description DotR (Defense of the Robots) Allstars是一个风靡全球的魔兽地图,他的规则简单与同样流行的地图DotA (Defense of the Anc ...
- [bzoj1017][JSOI2008]魔兽地图 DotR (Tree 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]$是很难转移的,主要原因是无法维护和其他儿 ...
- 【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 ...
- BZOJ [JSOI2008]魔兽地图DotR
1017: [JSOI2008]魔兽地图DotR Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 1243 Solved: 532[Submit][S ...
- 1017: [JSOI2008]魔兽地图DotR - BZOJ
Description DotR (Defense of the Robots) Allstars是一个风靡全球的魔兽地图,他的规则简单与同样流行的地图DotA (Defense of the Anc ...
随机推荐
- 死磕 java同步系列之自己动手写一个锁Lock
问题 (1)自己动手写一个锁需要哪些知识? (2)自己动手写一个锁到底有多简单? (3)自己能不能写出来一个完美的锁? 简介 本篇文章的目标一是自己动手写一个锁,这个锁的功能很简单,能进行正常的加锁. ...
- 洛谷——P3576 [POI2014]MRO-Ant colony
P3576 [POI2014]MRO-Ant colony 题目描述 The ants are scavenging an abandoned ant hill in search of food. ...
- SystemTap使用技巧 1 - 4 非常重要
http://blog.csdn.net/wangzuxi/article/details/42849053
- esrichina
http://www.esrichina.com.cn/arcgis10.5/index.html#fillback=0100307b617b7b7b363736363039323733627b617 ...
- 高效的MySQL的批插入 BULK INSERT
原文:http://www.open-open.com/code/view/1453702496573 MySQL的批插入 BULK INSERT和load data的速度差不多,并且可靠. 语法如下 ...
- ASP.NETCore使用AutoFac依赖注入
原文:ASP.NETCore使用AutoFac依赖注入 实现代码 1.新建接口类:IRepository.cs,规范各个操作类的都有那些方法,方便管理. using System; using Sys ...
- MongoDB副本集的原理,搭建
介绍: mongodb副本集即客户端连接到整个副本集,不关心具体哪一台机器是否挂掉.主服务器负责整个副本集的读写,副本集定期同步数据备份,一旦主节点挂掉,副本节点就会选举一个新的主服务器,这一切对于应 ...
- centos 7 卸載 mysql
跟網上文章,安裝了一個mysqlwget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm 記下卸載過程: 首先执行查看命令 ...
- 使用squid架设自己的代理server
主要參考了 http://blog.chinaunix.net/uid-20778906-id-540115.html Ubuntu下Squid代理server的安装与配置 1 安装 $ sudo a ...
- JAVASE学习笔记:第八章 经常使用类Util工具包之日期类、数字类
一.Date类 日期类 所在java.Util工具包 before(Date when) 測试此日期是否在指定日期之前. getDay() 获取星期的某一天 getDate( ...