题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1017

钱数很少,所以它也能压进状态里。

还有向上贡献几个物品。所以状态就是第 i 号物品,向上贡献 j 个,总共花 k 元的当前就能得到的力量。

然后可以树形dp。

不同的是平常的树形dp,该点的值就顺便充当前 r 个子树的值;遍历完子树就完成自己的值。

  但这里的状态里有一个“向上贡献 j 个”,不太好弄。所以另开一个 g ,只关注花了多少钱和带来多少力量。

  为了能用这个g转移到dp,不出现花了某些钱其实买不够向上贡献的 j 个当前物品的情况,应该把“总共买 l 个当前物品”放在最外面枚举。

    并且是倒序,为了沿用上一轮的g值。

**不知为何,自己的代码比别人慢了好多!!我觉得没什么不同呀……以后再来看看吧。

#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
const int N=,M=;const ll INF=0x7fffffff;
int n,m,head[N],xnt,du[N];
ll a[N],L[N],c[N],dp[N][N<<][M],g[N][M],h[N][M],ans;//dp[][N<<1][]不能dp[][N][]
struct Edge{
int next,to;ll w;
Edge(int n=,int t=,ll w=):next(n),to(t),w(w) {}
}edge[N];
void dfs(int cr)
{
if(!head[cr])
{
L[cr]=min(L[cr],m/c[cr]);
for(int i=;i<=L[cr];i++)
for(int j=;j<=i;j++)
dp[cr][j][i*c[cr]]=(i-j)*a[cr];
return;
}
L[cr]=INF;
for(int i=head[cr],v;i;i=edge[i].next)
{
dfs(v=edge[i].to);L[cr]=min(L[cr],L[v]/edge[i].w);
c[cr]+=c[v]*edge[i].w; //只是用来限制L[cr]
}
L[cr]=min(L[cr],m/c[cr]);
memset(g,-,sizeof g);//g只和子树阶段、钱有关,因为dp涉及"向上贡献几个",所以不方便同时表示前几个子树的力量值
g[][]=;
for(int l=L[cr];l>=;l--)//g不重赋值,所代表的状态应该足以合成当前的l个当前装备;所以需倒序
{
int tot=;
for(int i=head[cr];i;i=edge[i].next)
{
tot++;
for(int k=;k<=m;k++)//用了k钱
for(int j=;j<=k;j++)//j钱给v
g[tot][k]=max(g[tot][k],g[tot-][k-j]+dp[edge[i].to][l*edge[i].w][j]);//k-j钱给之前的子树
}
for(int j=;j<=l;j++)
for(int k=;k<=m;k++)
dp[cr][j][k]=max(dp[cr][j][k],g[tot][k]+a[cr]*(l-j));//子树们的节余+自己的节余
}
}
int main()
{
scanf("%d%d",&n,&m);char ch;int u,x;ll z;
memset(L,,sizeof L);
memset(dp,-,sizeof dp);//////
for(int i=;i<=n;i++)
{
scanf("%lld %c",&a[i],&ch);
if(ch=='B')
{
scanf("%lld%lld",&c[i],&L[i]);
}
else
{
scanf("%d",&u);
for(int j=;j<=u;j++)
{
scanf("%d%lld",&x,&z);
edge[++xnt]=Edge(head[i],x,z);head[i]=xnt;du[x]++;
}
}
}
int tot=;
for(int i=;i<=n;i++)
if(!du[i])
{
dfs(i);tot++;
for(int k=;k<=m;k++)//总共
for(int j=;j<=m;j++)//给之前的树
h[tot][k]=max(h[tot][k],h[tot-][j]+dp[i][][k-j]);
}
for(int i=;i<=m;i++)ans=max(ans,h[tot][i]);
printf("%lld",ans);
return ;
}

bzoj1017(JSOI2008)魔兽地图的更多相关文章

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

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

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

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

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

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

  4. BZOJ1017 [JSOI2008]魔兽地图DotR 【树形dp + 背包dp】

    题目链接 BZOJ1017 题解 orz hzwer 树形dp神题 设\(f[i][j][k]\)表示\(i\)号物品恰好花费\(k\)金币,并将\(j\)个物品贡献给父亲的合成时的最大收益 计算\( ...

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

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

  6. bzoj1017 [JSOI2008]魔兽地图DotR——DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1017 好难想的状态啊!f[i][j][k]表示i号物品有j个向上贡献,一共花了k钱的最大力量 ...

  7. 【BZOJ1017】[JSOI2008]魔兽地图(动态规划)

    [BZOJ1017][JSOI2008]魔兽地图(动态规划) 题面 BZOJ 洛谷 题解 状态设一下,\(f[i][j][k]\)表示第\(i\)个物品,有\(j\)个用于合成,总花费为\(k\)的最 ...

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

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

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

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

随机推荐

  1. Ubuntu14.04安装CUDA6.5

    机器配置: 双系统:win10 64bit+ ubuntu14.04 LTS 64bit 显卡: GeForce 405 cuda版本: cuda 6.5 参考: http://m.blog.csdn ...

  2. nyoj151——中国剩余定理

    生理周期 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 142220   Accepted: 45744 Descripti ...

  3. sqlserver数据库标注为可疑的解决办法

    前几天客户那边的服务器死机了,然后客户强制关机,重新启动服务器后,系统就没法正常使用,连接不上服务器,我远程操作后,看到数据库标注为可疑,由于客户之前没备份数据库,看来只能是修复了: 1:停止数据库服 ...

  4. Dir命令

    注: 此系列为自己之前所搭建网站内容. 其实python的os模块能够很好的完成此任务.改天总结下. 之前在处理气象数据时,十几个文件,文件名比较长,需要自己处理变动的年份找出地址的规律再进行文件的读 ...

  5. os模块、文件压缩 、匹配文件后缀名:fnmatch glob

    一.os模块 os模块:是python是系统交互的模块 import os # 0平台信息的一些操作 python是夸平台的,所以内部兼容了不同的平台 1. os.name # 操作系统 nt是win ...

  6. Quartz教程四:Trigger

    原文链接 | 译文链接 | 翻译:nkcoder 本系列教程由quartz-2.2.x官方文档翻译.整理而来,希望给同样对quartz感兴趣的朋友一些参考和帮助,有任何不当或错误之处,欢迎指正:有兴趣 ...

  7. 1: 介绍Prism5.0(纯汉语版)

      Prism帮助更简单的设计丰富,灵活,易维护的WPF桌面程序.其中使用MVVM,组合式视图,事件聚合等设计模式.这很符合一些重要的架构设计及原则.帮助你创建一个模块化的应用程序——可以独立开发松耦 ...

  8. 前端url传递编码问题

    JAVASCRIPT中URL 传递参数(特殊字符)解决方法及转码解码的介绍 有些符号在URL中是不能直接传递的,如果要在URL中传递这些特殊符号,那么就要使用他们的编码了.下表中列出了一些URL特殊符 ...

  9. Error:Cause: org/gradle/api/publication/maven/internal/DefaultMavenFactory 解决办法

    当你使用的Gradle版本是2.4以上,Android插件版本是1.3.0以上的时候就会出现这个问题,这时候你只需将android-maven-gradle-plugin插件版本改为classpath ...

  10. volatile关键字解析(二)

    volatile详解接下来,我们详细讲述一下volatile关键字volatile关键字具有两重语义 保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这个新值对其他线程来说是 ...