bzoj 1017 : [JSOI2008]魔兽地图DotR
比较难想的的一道树形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的更多相关文章
- bzoj 1017: [JSOI2008]魔兽地图DotR【树形dp+背包】
bzoj上是一个森林啊--? dp还是太弱了 设f[i][j][k]为到点i,合成j个i并且花费k金币能获得的最大力量值,a[i]为数量上限,b[i]为价格,p[i]为装备力量值 其实这个状态设计出来 ...
- 1017: [JSOI2008]魔兽地图DotR - BZOJ
Description DotR (Defense of the Robots) Allstars是一个风靡全球的魔兽地图,他的规则简单与同样流行的地图DotA (Defense of the Anc ...
- BZOJ.1017.[JSOI2008]魔兽地图(树形DP 背包DP)
题目链接 树形DP,考虑子节点对父节点的贡献. 设f[x][i][j]表示当前为x,用i个x去合成上一层装备,花费为j的最大价值. 由子节点转移时 是一个分组背包,需要一个辅助数组g[i][j]表示前 ...
- 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
1017: [JSOI2008]魔兽地图DotR Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 2597 Solved: 1010[Submit][ ...
- [bzoj1017][JSOI2008]魔兽地图 DotR (Tree DP)【有待优化】
Description DotR (Defense of the Robots) Allstars是一个风靡全球的魔兽地图,他的规则简单与同样流行的地图DotA (Defense of the Anc ...
- BZOJ1017: [JSOI2008]魔兽地图DotR【树形DP】【玄学】
Description DotR (Defense of the Robots) Allstars是一个风靡全球的魔兽地图,他的规则简单与同样流行的地图DotA (Defense of the Anc ...
- BZOJ1017: [JSOI2008]魔兽地图DotR
传送门 设$f[i][j][k]$表示对于第$i$个点,向父节点贡献$j$个已合成的装备,花费了$k$的代价,最多获得的力量值. 单纯的$f[i][j][k]$是很难转移的,主要原因是无法维护和其他儿 ...
随机推荐
- 线程_synchronized_volatile_ReentranLock
线程:cpu同时执行多个任务 synchonized 代码块,对象,类 同步方法和非同步方法可以同时执行同步方法可以调用同步方法(重入)脏读:之同步写,不同步读死锁的demo 一个线程先对A加锁 ...
- Mysql数据库的隔离级别
Mysql数据库的隔离级别有四种 1.read umcommitted 读未提交(当前事务可以读取其他事务没提交的数据,会读取到脏数据) 2.read committed 读已提交(当前事务不能读 ...
- R软件中 文本分析安装包 Rjava 和 Rwordseg 傻瓜式安装方法四部曲
这两天,由于要做一个文本分析的内容,所以搜索了一天R语言中的可以做文本分析的加载包,但是在安装包的过程,真是被虐千百遍,总是安装不成功.特此专门写一篇博文,把整个心塞史畅快的释放一下. ------- ...
- Hadoop Streaming框架使用(二)
上一篇文章介绍了Streaming的各种参数,本文具体介绍使用方法. 提交hadoop任务示例: $HADOOP_HOME/bin/hadoop streaming \ -input /user/te ...
- 软件工程-东北师大站-第十二次作业(PSP)
1.本周PSP 2.本周进度条 3.本周累计进度图 代码累计折线图 博文字数累计折线图 4.本周PSP饼状图
- 王者荣耀交流协会final发布-第一次scrum立会
1.例会照片 成员王超,高远博,冉华,王磊,王玉玲,任思佳,袁玥全部到齐 master:袁玥 2.时间跨度 2017年12月1日 17:00 — 17:31,总计31分钟 3.地点 一食堂二楼沙发座椅 ...
- jdbc连接获取表名称
1,Class.forName可以替换为mysql之类其他的数据库驱动 public Connection connect(String url,String username,String pw, ...
- Daily Scrum5 11.7
今日任务: 姓名 任务 时长 徐钧鸿 学习了java连接sqlserver的方法并且实现了连接池 2h 张艺 继续完成和用户管理有关的类的移植(Register.Success.Validate等) ...
- Daily Scrum (2015/11/1)
今天晚上我们照例召开了每周末的小组例会,主要总结本周的工作和讨论下一周的工作. 首先是本周的一些主要工作: 1.进行了代码的修改和完善. 2.开始进行服务器配置和UI. 3.学习借鉴了nutch爬虫的 ...
- Alpha阶段产品功能说明
先展示一下我们的功能流程图吧~ 一.学生用户 1. 学生登陆注册 BuaaClubs是北航所有在校生都可以注册登录的网站. 登陆界面是这样哒~ 2. 浏览报名活动 同学们可以在这个网站上查看所有社团发 ...