比较难想的的一道树形dp。

看到这道题正常的思路应该是$f[i][j][k]$表示i这棵子树里买了j个i物品花费为k的最大收益。

但如果直接这么定义的话转移复杂度会很高,需要枚举j,枚举孩子,枚举k,枚举孩子的花费,还要枚举每个孩子各买了多少件。

想办法把最后一个循环去掉。

重新定义状态$f[i][j][k]$表示表示i这棵子树里至少买了j个i物品花费为k的最大收益。

每次枚举完物品数量后加上这么一句

if(i!=l[x])f[x][i][j]=max(f[x][i][j],f[x][i+1][j]);

l[x]为x的最大数量。

相当于一个后缀最大值。

就可以轻松转移了。

虽然复杂度还是有些高。(貌似存在复杂度更低的算法?)

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define inf 0x3f3f3f3f
using namespace std;
int n,m;
int f[][][];
int g[][];
int v[],cost[],l[];
int head[],ver[],nxt[],tot,quan[];
void add(int a,int b,int c)
{
tot++;nxt[tot]=head[a];head[a]=tot;ver[tot]=b;quan[tot]=c;return ;
}
bool vis[];
void dfs(int x)
{
if(!head[x])
{
l[x]=min(l[x],m/cost[x]);
for(int i=;i<=l[x];i++)
{
for(int j=;j<=i;j++)
{
f[x][j][i*cost[x]]=i*v[x];
}
}
return ;
}
l[x]=inf;
for(int i=head[x];i;i=nxt[i])
{
dfs(ver[i]);
l[x]=min(l[x],l[ver[i]]/quan[i]);
cost[x]+=cost[ver[i]]*quan[i];
}
l[x]=min(l[x],m/cost[x]);
memset(g,0xcf,sizeof(g));
g[][]=;
for(int i=l[x];i>=;i--)
{
int cnt=;
for(int j=head[x];j;j=nxt[j])
{
cnt++;
for(int k=;k<=m;k++)
{
for(int l=;l<=k;l++)
{
g[cnt][k]=max(g[cnt][k],g[cnt-][l]+f[ver[j]][i*quan[j]][k-l]-v[ver[j]]*(i*quan[j]));
}
}
}
for(int j=;j<=m;j++)
{
f[x][i][j]=g[cnt][j]+i*v[x];
if(i!=l[x])f[x][i][j]=max(f[x][i][j],f[x][i+][j]);
}
} return ;
}
int main()
{
scanf("%d%d",&n,&m);
memset(f,0xcf,sizeof(f));
for(int i=;i<=n;i++)
{
scanf("%d",&v[i]);
char s[];scanf("%s",s);
if(s[]=='A')
{
int num;
int t1,t2;
scanf("%d",&num);
for(int j=;j<=num;j++)
{
scanf("%d%d",&t1,&t2);
vis[t1]=;
add(i,t1,t2);
}
}
else
{
scanf("%d%d",&cost[i],&l[i]);
}
}
int root=;
for(int i=;i<=n;i++)
{
if(!vis[i])add(,i,);
}
dfs(root);
int ans=;
for(int i=;i<=m;i++)ans=max(ans,f[root][][i]);
printf("%d\n",ans);
return ;
}

bzoj 1017 : [JSOI2008]魔兽地图DotR的更多相关文章

  1. bzoj 1017: [JSOI2008]魔兽地图DotR【树形dp+背包】

    bzoj上是一个森林啊--? dp还是太弱了 设f[i][j][k]为到点i,合成j个i并且花费k金币能获得的最大力量值,a[i]为数量上限,b[i]为价格,p[i]为装备力量值 其实这个状态设计出来 ...

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

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

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

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

  4. BZOJ [JSOI2008]魔兽地图DotR

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. 线程_synchronized_volatile_ReentranLock

    线程:cpu同时执行多个任务 synchonized   代码块,对象,类 同步方法和非同步方法可以同时执行同步方法可以调用同步方法(重入)脏读:之同步写,不同步读死锁的demo  一个线程先对A加锁 ...

  2. 开发简单的IO多路复用web框架

    自制web框架 1.核心IO多路复用部分 # -*- coding:utf-8 -*- import socket import select class Snow(): def __init__(s ...

  3. mybatis之模糊查询SQL

    一,MySQL数据库 name like concat('%' , #{name} , '%') 二,Oracle数据库 name like '%' || #{name} || '%'

  4. BugPhobia开发篇章:Scurm Meeting-更新至0x03

    0x01 :目录与摘要 If you weeped for the missing sunset, you would miss all the shining stars 索引 提纲 整理与更新记录 ...

  5. Daily Scrum (2015/10/21)

    今天可以说是项目正式开始的第一天,由于大家缺乏做团队项目的经验,对TFS的使用都还不太熟悉,所以今天大家的主要工作是熟悉TFS的使用和对代码进行初步的理解.我们预计需要2-3天时间来理解透彻源代码.以 ...

  6. 我是IT小小鸟读后感

    <我是一只IT小小鸟>一只是我想读list中一个本,但是上次去当当买的时候,竟然缺货了...昨天监考,实在无聊,就上网看电子书了,一天就看完了,看得有点仓促,所以理解估计不深. 1.刘帅: ...

  7. SDWebImage缓存图片的机制

    SDWebImage是一个很厉害的图片缓存的框架.既ASIHttp+AsyncImage之后,我一直使用AFNetworking集成的UIImageView+AFNetworking.h,但后者对于图 ...

  8. React---点击按钮实现内容复制功能

    思路: 1.给要复制的内容容器添加一个标签(可以是ID,可以是类名等),通过dom技术获取该容器对象: 2.创建Range对象(某个区域内连续的内容),把该容器对象放进去: 3.将Range对象添加到 ...

  9. 解决登录不上网页得tomcat(授权manager-gui角色的操作如下)

    1:编辑/usr/local/tomcat/conf/tomcat-users.xml文件,在没有注释的内容中添加: <role rolename="manager-gui" ...

  10. 初识asp

    1.ASP(Active Server Pages 动态服务器页面)是一种生成动态交互性网页的强有力工具 <!DOCTYPE html> <html> <body> ...