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. type和metaclass元类

    元类type 1. 创建类的两种方式 (都是由type元类创建) 方式一: class Foo(object): # 默认metaclass = type, 当前类, 由type类创建 a = 'aa ...

  2. codeforces 1041 d 二分

    题意转化:有一些区间,要求选一些连续的区间.两两区间间隔的和要求小于H.要求区间的长度和尽可能长. 二分区间长度的和,check一下就行 #include <bits/stdc++.h> ...

  3. Codeforces Round Edu 36

    A.B.C 略 D(dfs+强连通分量) 题意: 给出一个n(n<=500)点m(m<=100000)边的有向图,问能否通过删去一条边使得该图无环. 分析: 最简单的想法就是枚举一条边删去 ...

  4. <项目><day12>通讯录(视频)

    1 需求分析(需求分析师) 功能分析: 1)添加联系人 2)修改联系人 3)删除联系人 4)查询所有联系人 2 需求设计(系统分析师/架构师/资深开发人员) 2.1设计实体(抽象实体) 联系人实体: ...

  5. Java并发包——Atomic操作

    Java并发包——Atomic操作 摘要:本文主要学习了Java并发包下的atomic包中有关原子操作的一些类. 部分内容来自以下博客: https://blog.csdn.net/qq_303796 ...

  6. 石家庄地铁查询PSP0级

    一.需求   :地铁(石家庄地铁)线路查询 二.       学生:洪鼎淇 合作对象:宋子健 时间记录日志: 日期 开始时间 结束时间 中断时间 净时间 活动 2019/3/30 10:00 14:0 ...

  7. Spring事务管理概述

    以下内容引用自http://wiki.jikexueyuan.com/project/spring/transaction-management.html: 数据库事务是一个被视为单一的工作单元的操作 ...

  8. sys.argv的妙用:python命令行参数列表的修改、增加、删除

    是否妙用取决于你怎么用 1.sys.argv是用来获取命令行参数的方法,本身是一个list.你搜其实用方法,这方面的介绍最多,这里不赘述 2.那么问题是:sys.argv可以赋值吗?可以扩充吗?可以修 ...

  9. 常见machine learning模型实现

    一.感知机模型 二.线性回归(Linear Regression) from numpy import * def loadData(filename): x = [] y = [] f = open ...

  10. Web—CSS概述

    一.概念: 它是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言 的一个子集)等文件样式的计算机语言. 二.特点: 1.实现网页内容与样式的分离     2.降低图形文件的 ...