题目: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的更多相关文章

  1. [BZOJ1017][JSOI2008]魔兽地图DotR 树形dp

    1017: [JSOI2008]魔兽地图DotR Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 2597  Solved: 1010[Submit][ ...

  2. BZOJ1017: [JSOI2008]魔兽地图DotR【树形DP】【玄学】

    Description DotR (Defense of the Robots) Allstars是一个风靡全球的魔兽地图,他的规则简单与同样流行的地图DotA (Defense of the Anc ...

  3. [bzoj1017][JSOI2008]魔兽地图 DotR (Tree DP)【有待优化】

    Description DotR (Defense of the Robots) Allstars是一个风靡全球的魔兽地图,他的规则简单与同样流行的地图DotA (Defense of the Anc ...

  4. BZOJ1017 [JSOI2008]魔兽地图DotR 【树形dp + 背包dp】

    题目链接 BZOJ1017 题解 orz hzwer 树形dp神题 设\(f[i][j][k]\)表示\(i\)号物品恰好花费\(k\)金币,并将\(j\)个物品贡献给父亲的合成时的最大收益 计算\( ...

  5. BZOJ1017: [JSOI2008]魔兽地图DotR

    传送门 设$f[i][j][k]$表示对于第$i$个点,向父节点贡献$j$个已合成的装备,花费了$k$的代价,最多获得的力量值. 单纯的$f[i][j][k]$是很难转移的,主要原因是无法维护和其他儿 ...

  6. 【BZOJ-1017】魔兽地图DotR 树形DP + 背包

    1017: [JSOI2008]魔兽地图DotR Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 1566  Solved: 705[Submit][S ...

  7. 【bzoj1017】[JSOI2008]魔兽地图DotR

    1017: [JSOI2008]魔兽地图DotR Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 1658  Solved: 755[Submit][S ...

  8. BZOJ [JSOI2008]魔兽地图DotR

    1017: [JSOI2008]魔兽地图DotR Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 1243  Solved: 532[Submit][S ...

  9. 1017: [JSOI2008]魔兽地图DotR - BZOJ

    Description DotR (Defense of the Robots) Allstars是一个风靡全球的魔兽地图,他的规则简单与同样流行的地图DotA (Defense of the Anc ...

随机推荐

  1. 关于css虚线

    今天遇到几个虚线效果,不能一下子反应过来具体属性. 一.dashed和dotted的区别 首先是dashed和dotted都是指“虚线”,但是两者显示的效果不尽相同. 从字面意思来看, dashed: ...

  2. js中的offsetParent,offsetLeft,offsetTop及jquery的offset(),position()比较

    1.offsetParent 元素的offsetParent并不是元素的父元素,判断元素的offsetParent要根据以下情况: 1)当DOM结构层次中的元素均没有进行css定位(设置positio ...

  3. [Bzoj3205][Apio2013]机器人(斯坦纳树)(bfs)

    3205: [Apio2013]机器人 Time Limit: 15 Sec  Memory Limit: 128 MBSubmit: 977  Solved: 230[Submit][Status] ...

  4. 3.JAVA语言基础部分—Class类与反射

    什么是Java反射机制? JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的以及动态调用对象的方法的功能称为 ...

  5. PostgreSQL SystemTap on Linux

    http://digoal126.wap.blog.163.com/w2/blogDetail.do;jsessionid=3949B03DE151DA0E55D807466C5E630B.yqblo ...

  6. FIREDAC字段类型映射

    为什么需要字段类型映射? 作为通用型数据引擎的FIREDAC或者UNIDAC,驱动某一种数据库以后,总有一些数据库的一些字段类型,数据引擎不能识别,反应到程序中就是数据引擎不能正确地读取该字段的值 . ...

  7. [转]通俗易懂的php多线程解决方案

    原文: https://www.w3cschool.cn/php/php-thread.html --------------------------------------------------- ...

  8. C++ 宏定义与常量

    原文: http://blog.csdn.net/t894690230/article/details/50605021 前言:突然想起很久之前上课时被问及C++ 宏定义与常量的区别,仔细了想了想,并 ...

  9. sql查询语句整理

    首先这是我以下语句查询的一个表结构 t_user插入例如以下数据 t_depart中插入例如以下数据 t_role插入例如以下数据 好,建好表后,我们開始数据库查询语句 简单的查询语句 1. 查看表结 ...

  10. java中简单字符替换

    在网络编程中,假设URL含有特殊字符,如空格.'#'等,server将无法识别导致无法获得正确的參数值.我们须要将这些特殊字符转换成server能够识别的字符,比如将空格转换成'%20'.给定一个字符 ...