bzoj 1017: [JSOI2008]魔兽地图DotR【树形dp+背包】
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+背包】的更多相关文章
- [BZOJ1017][JSOI2008]魔兽地图DotR 树形dp
1017: [JSOI2008]魔兽地图DotR Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 2597 Solved: 1010[Submit][ ...
- 【BZOJ-1017】魔兽地图DotR 树形DP + 背包
1017: [JSOI2008]魔兽地图DotR Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 1566 Solved: 705[Submit][S ...
- bzoj 1017 : [JSOI2008]魔兽地图DotR
比较难想的的一道树形dp. 看到这道题正常的思路应该是$f[i][j][k]$表示i这棵子树里买了j个i物品花费为k的最大收益. 但如果直接这么定义的话转移复杂度会很高,需要枚举j,枚举孩子,枚举k, ...
- BZOJ.1017.[JSOI2008]魔兽地图(树形DP 背包DP)
题目链接 树形DP,考虑子节点对父节点的贡献. 设f[x][i][j]表示当前为x,用i个x去合成上一层装备,花费为j的最大价值. 由子节点转移时 是一个分组背包,需要一个辅助数组g[i][j]表示前 ...
- 1017: [JSOI2008]魔兽地图DotR - BZOJ
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 ...
- BZOJ [JSOI2008]魔兽地图DotR
1017: [JSOI2008]魔兽地图DotR Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 1243 Solved: 532[Submit][S ...
- 【bzoj1017】[JSOI2008]魔兽地图DotR
1017: [JSOI2008]魔兽地图DotR Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 1658 Solved: 755[Submit][S ...
- BZOJ1017: [JSOI2008]魔兽地图DotR【树形DP】【玄学】
Description DotR (Defense of the Robots) Allstars是一个风靡全球的魔兽地图,他的规则简单与同样流行的地图DotA (Defense of the Anc ...
随机推荐
- Eddy's AC难题--hdu2200(递推)
Problem Description Eddy是个ACMer,他不仅喜欢做ACM题,而且对于Ranklist中每个人的ac数量也有一定的研究,他在无聊时经常在纸上把Ranklist上每个人的ac题目 ...
- 洛谷——P3225 [HNOI2012]矿场搭建
P3225 [HNOI2012]矿场搭建 题目描述 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤 ...
- Codeforces 938G(cdq分治+可撤销并查集+线性基)
题意: 有一个无向连通图,支持三个操作: 1 x y d : 新建一条x和y的无向边,长度为d 2 x y :删除x和y之间的无向边 3 x y :询问x到y的所有路径中(可以绕环)最短的 ...
- 洛谷 P3811 【模板】乘法逆元
P3811 [模板]乘法逆元 题目背景 这是一道模板题 题目描述 给定n,p求1~n中所有整数在模p意义下的乘法逆元. 输入输出格式 输入格式: 一行n,p 输出格式: n行,第i行表示i在模p意义下 ...
- Centos5.11 //IP/phpmyadmin 远程无法登入
异地登入phpmyadmin时,会出现"You don't have permission to access /phpmyadmin/ on this server."这是因为配 ...
- POJ 3488 & HDU 1915 Arne Saknussemm(模拟)
题目链接: POJ:http://poj.org/problem? id=3488 HDU:pid=1915">http://acm.hdu.edu.cn/showproblem.ph ...
- HTC 328T 提示手机存储不足 out of space怎么办
不要再用什么软件做优化,做清理,都是治标不治本啊. 1 用豌豆荚备份数据 2 手机恢复出厂设置 3 用豌豆荚恢复数据
- RAM、ROM和磁盘
计算机存储数据的存储器主要分为RAM(随机訪问存储器).ROM.磁盘. RAM又分为SRAM和DRAM两种,SRAM用作快速缓存,DRAM用作主存. 1.SRAM SRAM又被称为静态RAM.利 ...
- “var arr = []; ”和 “var arr = {};” 的差别
1.面试题 var arr = []; var arr = {}; 比較上述代码有什么差别? 2.解析 var arr = [];是一个数组对象 var arr = {} ...
- 全局最小割模版 n^3
//点标从0-n-1, 開始时先init 复杂度n^3 //对于边(u,v,flow): //g[u][v]+=flow; //g[v][u]+=flow; typedef long long ll; ...