题目: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. [TJOI2019]唱、跳、rap和篮球_生成函数_容斥原理_ntt

    [TJOI2019]唱.跳.rap和篮球 这么多人过没人写题解啊 那我就随便说说了嗷 这题第一步挺套路的,就是题目要求不能存在balabala的时候考虑正难则反,要求必须存在的方案数然后用总数减,往往 ...

  2. codevs3249搭积木

    3249 搭积木  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description Petya有一个A×B×C的长方体积木,积 ...

  3. JavaSE的static、final、abstract修饰符

    static :静态常量,静态方法,静态代码块     静态变量:  静态变量属于类的,使用类名来访问,非静态变量是属于对象的,"必须"使用对象来访问.           注意: ...

  4. Windows下Python安装pyecharts

    都说pyechart用来可视化好,可是安装的时候各种坑 正常情况是 pip install pyecharts 然后各种报错,找到一种可行的方式 在https://pypi.org/project/p ...

  5. linux批量解压和批量压缩

    ls *.tar.gz | xargs -n1 tar xzvf //批量解压 ls | awk '{ print "tar zcvf "$0".tar.gz " ...

  6. IE浏览器打不开解决的方法

    windows 7和windows 8上的IE浏览器打不开.非常可能是权限问题,解决的方法: 点击"開始"-"执行",输入"regedit" ...

  7. svn 创建分支、切换分支 及 合并分支 操作

    关联远程仓库: 右键  ---  点击 ' SVN Checkout...' 生成 打开trunk目录,在trunk目录下新建两个文本文件A.java,B.java: 打开A.java输入以下内容: ...

  8. Effective C++ 条款二 用编译器替换预编译器

    /************************************************************************/ /* C++条款二:用编译器替换预编译器 */ / ...

  9. c程序设计语言第一章1

    1,c程序都是由函数和变量组成的. 练习1.6验证布尔表达式getchar()!= EOF的取值是0还是1 答: #include <stdio.h> #include <stdli ...

  10. flask-本地线程-请求上下文补充

    context(上下文)是flask里面非常好的设计,使用flask需要非常理解应用上下文和请求上下文这两个概念 本地线程 本地线程(thread local)希望不同的线程对于内容的修改只在线程内部 ...