bzoj上是一个森林啊……?

dp还是太弱了

设f[i][j][k]为到点i,合成j个i并且花费k金币能获得的最大力量值,a[i]为数量上限,b[i]为价格,p[i]为装备力量值

其实这个状态设计出来就好做了,树上背包随便转移一下就行了

因为是森林,所以最后统计答案的时候也要再做一遍背包

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=55;
int n,m,h[N],cnt,ans,p[N],a[N],b[N],f[N][105][2005],g[N][2005],d[N],t[N][2005],tot;
char s[5];
struct qwe
{
int ne,to,va;
}e[20005];
int read()
{
int r=0,f=1;
char p=getchar();
while(p>'9'||p<'0')
{
if(p=='-')
f=-1;
p=getchar();
}
while(p>='0'&&p<='9')
{
r=r*10+p-48;
p=getchar();
}
return r*f;
}
void add(int u,int v,int w)
{
cnt++;
e[cnt].to=v;
e[cnt].ne=h[u];
e[cnt].va=w;
d[v]++;
h[u]=cnt;
}
void dp(int u)
{
if(!h[u])
{
a[u]=min(a[u],m/b[u]);
for(int i=0;i<=a[u];i++)
for(int j=i;j<=a[u];j++)
f[u][i][j*b[u]]=(j-i)*p[u];
return;
}
a[u]=1e9;
for(int i=h[u];i;i=e[i].ne)
{
dp(e[i].to);
a[u]=min(a[u],a[e[i].to]/e[i].va);
b[u]+=e[i].va*b[e[i].to];
}
a[u]=min(a[u],m/b[u]);
memset(g,-0x3f,sizeof(g));
g[0][0]=0;
for(int l=a[u];l>=0;l--)
{
int tot=0;
for(int i=h[u];i;i=e[i].ne)
{
tot++;
for(int j=0;j<=m;j++)
for(int k=0;k<=j;k++)
g[tot][j]=max(g[tot][j],g[tot-1][j-k]+f[e[i].to][l*e[i].va][k]);
}
for(int j=0;j<=l;j++)
for(int k=0;k<=m;k++)
f[u][j][k]=max(f[u][j][k],g[tot][k]+p[u]*(l-j));
}
}
int main()
{
n=read(),m=read();
for(int i=1;i<=n;i++)
{
p[i]=read();
scanf("%s",s);
if(s[0]=='A')
{
int x=read();
while(x--)
{
int y=read(),z=read();
add(i,y,z);
}
}
else
b[i]=read(),a[i]=read();
}
memset(f,-0x3f,sizeof(f));
for(int x=1;x<=n;x++)
if(!d[x])
{
dp(x);
tot++;
for(int i=0;i<=m;i++)
for(int j=0;j<=i;j++)
for(int k=0;k<=a[x];k++)
t[tot][i]=max(t[tot][i],t[tot-1][j]+f[x][k][i-j]);
}
for(int i=0;i<=m;i++)
ans=max(ans,t[tot][i]);
printf("%d\n",ans);
return 0;
}

bzoj 1017: [JSOI2008]魔兽地图DotR【树形dp+背包】的更多相关文章

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

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

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

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

  3. bzoj 1017 : [JSOI2008]魔兽地图DotR

    比较难想的的一道树形dp. 看到这道题正常的思路应该是$f[i][j][k]$表示i这棵子树里买了j个i物品花费为k的最大收益. 但如果直接这么定义的话转移复杂度会很高,需要枚举j,枚举孩子,枚举k, ...

  4. BZOJ.1017.[JSOI2008]魔兽地图(树形DP 背包DP)

    题目链接 树形DP,考虑子节点对父节点的贡献. 设f[x][i][j]表示当前为x,用i个x去合成上一层装备,花费为j的最大价值. 由子节点转移时 是一个分组背包,需要一个辅助数组g[i][j]表示前 ...

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

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

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

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

  7. BZOJ [JSOI2008]魔兽地图DotR

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

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

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

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

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

随机推荐

  1. mysql查所有列名

    查询该视图  information_schema.columns  该有的都有 desc information_schema.columns; select * from information_ ...

  2. Codeforces 549C(博弈)

    C. The Game Of Parity time limit per test 1 second memory limit per test 256 megabytes input standar ...

  3. [vijos1891]学姐的逛街计划

                                                                     学姐的逛街计划 描述 doc 最近太忙了, 每天都有课. 这不怕, d ...

  4. 寒武纪camp Day1

    补题进度:8/10 A(组合计数) 题意: 一个人站在数轴原点,每秒有1/4概率向前走一步,1/4概率向后走一步,1/2概率不动,问t秒后在p位置的概率. t,p<=100000 分析: 枚举不 ...

  5. java面向对象基础编程题

    第一题: 设计一个形状类Shape,方法:求周长和求面积.形状类的子类:Rect(矩形),Circle(圆形).Rect类的子类:Square(正方形).不同的子类会有不同的计算周长和面积的方法1.总 ...

  6. java获得文件的最后修改时间

    原文:http://www.open-open.com/code/view/1453190044980 java的File类的lastModified()方法可以返回文件的最后修改时间: String ...

  7. 2&gt;MSVCRTD.lib(MSVCR100D.dll) : error LNK2005: _calloc 已经在 LIBCMTD.lib(dbgcalloc.obj) 中定义

    使用VS2010,在FireBreath里面调用ortp库和Speex库.编译的时候出现错误: 2>MSVCRTD.lib(MSVCR100D.dll) : error LNK2005: _ca ...

  8. 【LeetCode】Swap Nodes in Pairs 链表指针的应用

    题目:swap nodes in pairs <span style="font-size:18px;">/** * LeetCode Swap Nodes in Pa ...

  9. Android KK后为何工厂模式下无法adb 无法重新启动机器 ?

    前言          欢迎大家我分享和推荐好用的代码段~~ 声明          欢迎转载,但请保留文章原始出处:          CSDN:http://www.csdn.net        ...

  10. 【转】Selenium2学习路线

    课程大纲:第一部分:基础入门 第一课: SELENIUM2的原理介绍及环境搭建本节课主要讲解SELENIUM2的原理,让大家了解SELENIUM2的发展历程,同时解惑大家对自动化测试中产生的一些误区. ...