树上背包

题目传送门

首先,有没有哪位dalao 愿意告诉我为什么合成高级装备不需要附加金币,,

好吧,这个不重要

明确表示装备合成路线可以用一棵树来表示。一颗?傻乎乎的在下之前每次就只dp一棵树,不出意外的WA了,,在看几遍,好嘛,好像是个森林啊(泪奔)

最容易想到的dp[x][i][j]是第x件买了i个,花了j元的最高力量。但是,,这样好像就成为不可做题了(欢迎各路dalao打脸,反正不是我说的[手动滑稽](偷偷扔出FYJ挡枪)),那么换一种思路,还是dp[x][i][j],但表示的是第x件装备,用i件合成上级装备(即至少买了i件),花费j元的力量。如果i是基础装备,转移方程就直接出来了:d[x][i][j*cost[x]]=power[x]*(j-i)。

如果是高级装备呢?

那就枚举它买多少件,以及它的子装备买多少件,直接暴力转移,n^2*times^2。看看时限,3s,完全不方

在下代码比较丑,求各位不要介意

#include<bits/stdc++.h>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<queue>
#include<deque>
#include<list>
#include<set>
#include<vector>
#include<iostream>
#define ll int
#define re register
#define inf 0x3f3f3f3f
#define inl inline
#define sqr(x) (x*x)
//#define eps 1e-8
#define debug printf("debug\n");
//#pragma comment(linker, "/STACK:1024000000,1024000000")
//#pragma GCC optimize (2)
//#pragma G++ optimize (2)
using namespace std;
//const ll mod;
const ll MAXN=3e5+10;
inl ll read() {re ll x = 0; re int f = 1;char ch = getchar();while(ch<'0'||ch>'9') { if(ch== '-' ) f = -1; ch = getchar(); }while(ch>='0'&&ch<='9') {x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x * f;
}
inl char readc() {char ch=getchar();while(('z'<ch||ch<'a')&&('Z'<ch||ch<'A')) ch=getchar();return ch;
}
inl void write(re ll x){if(x>=10)write(x/10);putchar(x%10+'0');
}
inl void writeln(re ll x){if(x<0) {x=-x;putchar('-');}write(x); puts("");
}
inl ll gcd(re ll x,re ll y){while(y^=x^=y^=x%=y);return x;}
inl void FR() {freopen(".in","r",stdin);freopen(".out","w",stdout);
}
inl void FC() {fclose(stdin);fclose(stdout);
}
struct Node {ll u,v,w,nxt;
}e[20005<<1];
ll cnt,head[60],ssw[60],g[20005],cost[60],times[60];
bool fl[60],in[60],vis[60];
ll ans[20005];
inl void adde(ll u,ll v,ll w) {e[++cnt].u=u;e[cnt].v=v;e[cnt].w=w;e[cnt].nxt=head[u];head[u]=cnt;
}
ll d[60][105][2005],n,m;
void dp(ll x) {if(vis[x]) return ;vis[x]=1;if(!fl[x]) {//基础装备 times[x]=min(times[x],m/cost[x]);for(re ll i=times[x];~i;i--) {for(re ll j=i;j<=times[x];j++) {d[x][i][j*cost[x]]=ssw[x]*(j-i);}}return ;}for(re ll h=head[x];h;h=e[h].nxt) {dp(e[h].v);cost[x]+=e[h].w*cost[e[h].v];times[x]=min(times[x],times[e[h].v]/e[h].w);}times[x]=min(times[x],m/cost[x]);for(re ll i=times[x];~i;i--) {for(re ll j=1;j<=m;j++) g[j]=-inf;g[0]=0;for(re ll h=head[x];h;h=e[h].nxt) {for(re ll k=m;~k;k--) {re ll sst=-inf;for(re ll l=0;l<=k;l++) {sst=max(sst,g[k-l]+d[e[h].v][i*e[h].w][l]);}g[k]=sst;//花k元能到的最高力量
            }}for(re ll j=0;j<=i;j++) {for(re ll l=0;l<=m;l++) {d[x][j][l]=max(d[x][j][l],g[l]+ssw[x]*(i-j));}}}
}
int main(){
//    FR();n=read(),m=read();memset(times,inf,sizeof(times));memset(d,-inf,sizeof(d));for(re ll i=1;i<=n;i++) {ssw[i]=read();char sj[3];scanf("%s",sj);if(sj[0]=='A') {fl[i]=1;re ll c=read();for(re ll j=1;j<=c;j++) {re ll sx=read(),xs=read();if(!in[sx]) in[sx]=1;adde(i,sx,xs);}}else if(sj[0]=='B') {fl[i]=0;cost[i]=read();times[i]=read();}else puts("RE");}for(re ll i=1;i<=n;i++) {if(!in[i]) {//被坑无数次
            dp(i);for(re ll j=m;~j;j--) {for(re ll k=0;k<=j;k++) {ans[j]=max(ans[j],ans[j-k]+d[i][0][k]);}}}}writeln(ans[m]);
//    FC();return 0;
}

转载于:https://www.cnblogs.com/20020723YJX/p/9348020.html

[JSOI2008]魔兽地图相关推荐

  1. bzoj1017 [JSOI2008]魔兽地图DotR

    1017: [JSOI2008]魔兽地图DotR Time Limit: 30 Sec  Memory Limit: 162 MB Submit: 1230  Solved: 522 [Submit] ...

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

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

  3. 洛谷P4037 [JSOI2008]魔兽地图 题解

    洛谷P4037 [JSOI2008]魔兽地图 题解 题目链接:P4037 [JSOI2008]魔兽地图 题意: DotR (Defense of the Robots) Allstars是一个风靡全球 ...

  4. 1017: [JSOI2008]魔兽地图DotR

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

  5. [JSOI2008]魔兽地图(树形dp)

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

  6. [bzoj1017]:[JSOI2008]魔兽地图DotR

    传送门 JSOI2008 All Clear! 这个题简直了,我整个代码都是抄的,抄完还是一脸懵逼 我就tm没见过这么难的树形dp 一开始还以为水题,然后发现根本不知道怎么dp 题解还是直接抄hzwe ...

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

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

  8. 【C++】「JSOI-2008」魔兽地图DotR

    「JSOI-2008」魔兽地图DotR [来源] [题目描述] [输入格式] [输出格式] [样例输出] [样例输出] [解析] [代码] [来源] BZOJ-1017 计蒜客-T2793 vjudg ...

  9. [BZOJ]1017 魔兽地图DotR(JSOI2008)

    BZOJ第一页做着做着就能碰到毒题,做到BZOJ1082小C就忍了,没想到下一题就是这种东西.这种题目不拖出来枭首示众怎么对得起小C流逝的青春啊. Description DotR (Defense ...

最新文章

  1. 一台 Java 服务器可以跑多少个线程?
  2. npoi的mvc怎么ajax导出,asp.net mvc利用NPOI导入导出Excel解决方法
  3. 开发日记-20190423 关键词 android静态代理类代理方法打断点debug 退出当前activity 闪退
  4. 前端学习(2658):vue3优化
  5. 2016/11/07 线程的创建和启动
  6. 两个MYSQL数据同步的SHELL脚本
  7. 纳米丸穿透癌细胞(癌症)
  8. python3web库_基于 Python3 写的极简版 webserver
  9. 【黑金视频连载】NIOS II视频教程正式连载了!!!!!!!!
  10. 官方原版Windows XP SP3(VOL)简体中文版ISO下载
  11. Day22~Day28
  12. ios云信不能全屏_网易云信-新增自定义消息(iOS版)
  13. c语言写的一个恶意程序
  14. android八股文
  15. 数据分析盒马生鲜迭代选址策略!
  16. (生活)Photoshop入门(不定时更新)
  17. mysql如何减少主从复制延迟?
  18. Java web学习day12 Cookie
  19. 变频电源的输出滤波器的特点
  20. 根据文件数据,检测文件类型

热门文章

  1. xcode 4.3.2 use storyboard创建TableView
  2. OpenCV+python:霍夫变换与直线检测
  3. linux 3.4内核初始化,S3C2440移植linux3.4.2内核之内核框架介绍及简单修改
  4. vc 只有顶级窗口可以弹出窗口_如果你刚换了新电脑,这几个地方记得设置一下,电脑可以多用几年...
  5. python爬取晋江_[Arcpy] 爬取高德地图面状地物(半自动化)—获取任意地区的行政边界...
  6. linux 修改java版本_Linux 有问必答:如何在 Linux 中改变默认的 Java 版本
  7. mysql 最小日期函数_MySQL 日期加减函数汇总
  8. php中input的使用,php输入流php://input如何使用
  9. 华为机考HJ7取近似值
  10. Open3D点云处理算法最全合集