传送门

设$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的更多相关文章

  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——DP

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

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

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

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

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

  8. BZOJ [JSOI2008]魔兽地图DotR

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

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

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

随机推荐

  1. SQL SERVER 2005删除维护作业报错:The DELETE statement conflicted with the REFERENCE constraint "FK_subplan_job_id"

    案例环境: 数据库版本: Microsoft SQL Server 2005 (Microsoft SQL Server 2005 - 9.00.5000.00 (X64) ) 案例介绍: 对一个数据 ...

  2. SQL性能优化:如何定位网络性能问题

    一同事跟我反馈他遇到了一个SQL性能问题,他说全表只有69条记录,客户端执行耗费了两分多钟,这不科学呀.要我分析一下原因并解决.我按照类似表结构,构造了一个案例,测试截图如下所示 这个表有13800K ...

  3. JavaWeb开发环境准备之Linux篇

    01 Linux环境准备 (本文在win10上使用 VMware12 + Ubuntu14.04)   1.JDK安装及相关配置 参考:http://blog.csdn.net/sxdtzhaoxin ...

  4. ActiveMQ 5 入门

    apache-activemq-5.13.2 ActiveMQ使用JAAS授权的配置方式 <plugins> <!– 使用login.config配置授权用户 --> < ...

  5. register_shutdown_function AND fastcgi_finish_request

    在php中又两个方法都是在请求快结束的时候执行.方法名分别是 register_shutdown_function和fastcgi_finish_request.虽然执行的时机差不多,但是功能和应用场 ...

  6. 小结-stm32 驱动LED灯

    使用位带操作,位带操作就是把每个比特膨胀成一个32位的字,当访问这些字的时候就访问这些比特位. http://www.cnblogs.com/xiaobo-Linux/ 然后,端口使能: //³õʼ ...

  7. 15、sql语句集,Linux 下PHP查询mysql

    一.mysql 创建数据库 mysql密码,默认没有 如果想更改的话, mysqladmin  -uroot   password  root123 登录   : [root@localhost ro ...

  8. 旧文备份:CANopen协议PDO的几种传输方式

    (于2007.1.22) 由于PDO所传输的数据内容是无协议的且分配的标识符范围较SDO靠前,因此,其效率和优先级都是较高的,通常用于实时过程数据的传输. PDO是生产/消费类型的通讯方式,数据只有一 ...

  9. 数据库SQL基本操作

    1.查询表结构 desc 表名 2.显示当前连接用户 show user 3.查看系统拥有哪些用户 select * from all_users; 4.查询当前用户下所有对象 select * fr ...

  10. [No000082]Convert和Parse的区别/Convert.ToInt32()与int.Parse()的区别

    (1)这两个方法的最大不同是它们对null值的处理方法: Convert.ToInt32(null)会返回0而不会产生任何异常,但int.Parse(null)则会产生异常. 没搞清楚Convert. ...