BZOJ1017: [JSOI2008]魔兽地图DotR
设$f[i][j][k]$表示对于第$i$个点,向父节点贡献$j$个已合成的装备,花费了$k$的代价,最多获得的力量值。
单纯的$f[i][j][k]$是很难转移的,主要原因是无法维护和其他儿子的关系。所以对于每个节点再搞一个$g[i][j]$表示当前点的前$i$个儿子花费为$k$可以获得的最大的力量值。
然后肯定要先更新$g[][]$再以$g[][]$来更新$f[][][]$。
列出$g[i][j]$的状态转移方程就是:
$g[cnt][k]=max \{ f[son][tol \times edge_v][j] + g[cnt-1][k-j] \}$
其中$tol$表示当前点总共要合成的装备。
然后根据$g[i][k]$来更新$f[i][j][k]$:
$f[i][j][k]= max \{ g[cnt_{max}][k]+(tol-j) \times Power_i \} $
然后就能愉快的转移了。
我看其他人的代码关于$tol$的枚举是递减的从而减少不必要的memset。不是很理解,希望神犇留言告诉我QAQ,不过直接memset也不会超时。
//BZOJ 1017 //by Cydiater //2016.10.26 #include <iostream> #include <cstring> #include <string> #include <algorithm> #include <queue> #include <map> #include <ctime> #include <cmath> #include <cstdlib> #include <cstdio> #include <iomanip> #include <bitset> using namespace std; #define ll long long #define up(i,j,n) for(int i=j;i<=n;i++) #define down(i,j,n) for(int i=j;i>=n;i--) #define cmax(a,b) a=max(a,b) #define cmin(a,b) a=min(a,b) const int MAXN=1e4+5; const int oo=1000000001; inline int read(){ char ch=getchar();int x=0,f=1; while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } int N,M,len=0,LINK[MAXN],f[55][105][2005],Power[MAXN],Cost[MAXN],LIM[MAXN],indu[MAXN],g[55][MAXN],ans=0; bool tag[MAXN]; struct edge{ int y,next,v; }e[MAXN]; namespace solution{ inline void insert(int x,int y,int v){e[++len].next=LINK[x];LINK[x]=len;e[len].y=y;e[len].v=v;} void init(){ memset(indu,0,sizeof(indu)); N=read();M=read(); up(i,1,N)LIM[i]=oo; up(i,1,N){ Power[i]=read();char ch;scanf("%c",&ch); tag[i]=(ch=='A')?1:0; if(tag[i]){ int tmp=read(); while(tmp--){ int y=read(),v=read(); insert(i,y,v);indu[y]++; } }else{ Cost[i]=read();LIM[i]=read(); } } } void TreeDP(int node){ if(!tag[node]){ cmin(LIM[node],M/Cost[node]); up(i,0,LIM[node])up(j,0,i) f[node][j][i*Cost[node]]=Power[node]*(i-j); }else{ LIM[node]=oo; for(int i=LINK[node];i;i=e[i].next){ TreeDP(e[i].y);cmin(LIM[node],LIM[e[i].y]/e[i].v); Cost[node]+=e[i].v*Cost[e[i].y]; } cmin(LIM[node],M/Cost[node]); up(tol,0,LIM[node]){ int cnt=0; memset(g,-10,sizeof(g));g[0][0]=0; for(int i=LINK[node];i;i=e[i].next){ cnt++; up(j,0,M)up(k,0,j) cmax(g[cnt][j],g[cnt-1][j-k]+f[e[i].y][e[i].v*tol][k]); } up(j,0,tol)up(k,0,M)cmax(f[node][j][k],g[cnt][k]+(tol-j)*Power[node]); } } } void output(int node){ up(j,0,LIM[node])up(k,0,M)cmax(ans,f[node][j][k]); } } int main(){ freopen("input.in","r",stdin); using namespace solution; init(); memset(f,-10,sizeof(f)); up(i,1,N)if(indu[i]==0){ TreeDP(i); output(i); } cout<<ans<<endl; return 0; }
BZOJ1017: [JSOI2008]魔兽地图DotR的更多相关文章
- [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 【树形dp + 背包dp】
题目链接 BZOJ1017 题解 orz hzwer 树形dp神题 设\(f[i][j][k]\)表示\(i\)号物品恰好花费\(k\)金币,并将\(j\)个物品贡献给父亲的合成时的最大收益 计算\( ...
- bzoj1017 [JSOI2008]魔兽地图DotR——DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1017 好难想的状态啊!f[i][j][k]表示i号物品有j个向上贡献,一共花了k钱的最大力量 ...
- 【bzoj1017】[JSOI2008]魔兽地图DotR
1017: [JSOI2008]魔兽地图DotR Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 1658 Solved: 755[Submit][S ...
- 【BZOJ-1017】魔兽地图DotR 树形DP + 背包
1017: [JSOI2008]魔兽地图DotR Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 1566 Solved: 705[Submit][S ...
- BZOJ [JSOI2008]魔兽地图DotR
1017: [JSOI2008]魔兽地图DotR Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 1243 Solved: 532[Submit][S ...
- 1017: [JSOI2008]魔兽地图DotR - BZOJ
Description DotR (Defense of the Robots) Allstars是一个风靡全球的魔兽地图,他的规则简单与同样流行的地图DotA (Defense of the Anc ...
随机推荐
- $是对string.Format的简化
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- SQL Server解决孤立用户浅析
孤立用户概念 所谓孤立用户即指在服务器实例上未定义或错误定义了其相应 SQL Server 登录名的数据库用户无法登录到实例. 这样的用户被称为此服务器实例上的数据库的"孤立用 ...
- Database 'xxx' cannot be upgraded because it is read-only or has read-only file Make the database or files writeable, and rerun recovery.
在分离数据库DatabaseName(暂且用DatabaseName代替该数据库名)后,我将其数据文件以及日志文件移动到新增的磁盘上.然后附加该数据库,结果报如下错误: Database 'Dat ...
- 十几张表的join(千万级/百万级表) 7hours-->5mins
================START============================== 来了一个mail说是job跑得很慢,调查下原因 先来看下sql: SELECT h.order_ ...
- 《java JDK7 学习笔记》之类和对象
1.在java中,要产生对象必须先定义类,类是对象的设计图,对象是类的实例.类定义时使用class关键词,建立实例对象要使用new关键词.以类名声明的变量,称为参考名称.参考变量或直接叫参考. 2.想 ...
- 使用Docker快速部署Storm环境
Storm的部署虽然不是特别麻烦,但是在生产环境中,为了提高部署效率,方便管理维护,使用Docker来统一管理部署是一个不错的选择.下面是我开源的一个新的项目,一个配置好了storm与mono环境的D ...
- ARM汇编程序结构
ARM汇编程序结构 一个ARM程序可以被划分为多个代码段和数据段,在汇编的时候这些段会被形成一个可执行文件 .text ;正文段,包含程序的指令代码 .data ;数据段,包含固定的数据,如常量,字符 ...
- 科学计算器(JAVA实现)
前记: 大二学 Java 的时候写的,现在贴上来,只为留念. 再翻代码,自己看着都头疼.一重重的 if 嵌套,当时写得费劲,现在看着更费劲. 代码思想: 代码的大致思想是这样: 首先定义一个算式字符串 ...
- jdbc java数据库连接 2)jdbc接口核心的API
JDBC接口核心的API java.sql.* 和 javax.sql.*(java2.0以后更新的扩展) |- Driver接口: 表示java驱动程序接口.所有的具体的数据库厂商要来实现此接 ...
- ReactNative官方中文文档0.21
整理了一份ReactNative0.21中文文档,提供给需要的reactnative爱好者.ReactNative0.21中文文档.chm 百度盘下载:ReactNative0.21中文文档 来源: ...