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 ...
随机推荐
- Unity3D 对象池思想 在游戏开发中的运用
分类:U3D 1.在王者荣耀中,每30秒小兵会出现一波,出现之后会被敌方玩家或敌方小兵销毁,一局游戏下来,小兵会被创建多次,同时也会被销毁,在游戏中,这种频繁的创建和销毁游戏对象是很损耗性能的.在游戏 ...
- 33.Search in sorted Array
/* * 33.Search in sorted Array * 2016-4-19 by Mingyang * 我自己写的代码,开始没有考虑[3,1]取1得情况,所以现在需要额外的加一个部分来 * ...
- BZOJ 2809 APIO 2012 dispatching 平衡树启示式合并
题目大意:给出一棵树,每个节点有两个值,各自是这个忍者的薪水和忍者的领导力.客户的惬意程度是这个点的领导力乘可以取得人数.前提是取的人的薪水总和不超过总的钱数. 思路:仅仅能在子树中操作.贪心的想,我 ...
- Json实现异步请求(提交评论)
主要将代码粘贴,通过阅读代码理解当中的相关逻辑. html代码: <form id="form1" runat="server"> <p> ...
- ucgui界面设计演示样例2
ucgui界面设计演示样例2 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:WIN8 开发环境:MDK4.72 ucgui版本号:3 ...
- 常用shell命令的写法
这并不是教人怎么进行shell编程的文章,只是韦哥在工作中用到的一些简单脚本的写法.因为有些命令即使用过几次了,再次使用时仍然写不对,需要man来看下或者需要google,你也可以理解为对命令的理解不 ...
- FIR300M刷openwrt
淘宝看到一款FIR300M路由器,当时只要19.9元.图便宜就买了. Hardware Architecture: MIPS Vendor: MediaTek (Ralink) Bootloader: ...
- Tomcat 安装与配置规范
Tomcat 安装 演示版本:8.5.32 安装版 JDK推荐版本:jdk1.8 下载地址:https://tomcat.apache.org/download-80.cgi 安装教程 注意:tomc ...
- 创建Vue项目的步骤
第一步: 对于要创建项目的工作目录,要先进性管理,命令:npm init -y 第二步: 初始化webpack 包,命令:vue init webpack 自定义名称 第三步: 在components ...
- xamarin.android listview绑定数据及点击事件
前言 listview是用来显示数据列表的一个控件,今天给大家带来如何使用cursor进行数据绑定以及点击事件. 导读 1.如何创建一个listview 2.如何使用cursor进行绑定数据 3.li ...