记录编号 144721 评测结果 AAAAAAAAAA
题目名称 [JSOI 2008]魔兽地图 最终得分 100
用户昵称 Gravatar天一阁 是否通过 通过
代码语言 C++ 运行时间 1.162 s
提交时间 2014-12-26 16:40:49 内存使用 52.23 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#define Maxn 61
using namespace std;
vector<int> G[Maxn],C[Maxn];
int n,m,ind[Maxn]={0},L[Maxn],P[Maxn]={0},A[Maxn];
int f[Maxn][110][2010],type[Maxn],h[Maxn][2010];
char ch;
inline void init(){
 	memset(f,0xacf,sizeof(f));
	int x,y,z;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%d",&A[i]);
		G[i].clear(); C[i].clear();
		while(ch=getchar()) if(ch=='A'||ch=='B') break;
		if(ch=='A'){
			scanf("%d",&z); type[i]=0;
			for(int j=1;j<=z;j++){
				scanf("%d%d",&x,&y);
				G[i].push_back(x);
				C[i].push_back(y); ind[x]++;
			}
		}
		else{
			type[i]=1;
			scanf("%d%d",&P[i],&L[i]);
		}
	}
}
inline void dfs(int x){
	if(type[x]){
		L[x]=min(L[x],m/P[x]);
		for(int i=0;i<=L[x];i++){
			for(int j=i;j<=L[x];j++){
				f[x][i][j*P[x]]=(j-i)*A[x];
			}
		}
	}
	else{
		L[x]=0x3fffffff;
		for(int i=0;i<G[x].size();i++){
			dfs(G[x][i]);
			L[x]=min(L[x],L[G[x][i]]/C[x][i]);
			P[x]+=P[G[x][i]]*C[x][i];
		}
		L[x]=min(L[x],m/P[x]);
 		memset(h,0xacf,sizeof(h));
		h[0][0]=0;
		for(int l=L[x];l>=0;l--){
			for(int i=0;i<G[x].size();i++){
				for(int k=0;k<=m;k++){
					if(h[i][k]<0) continue;
					for(int j=k;j<=m;j++){
						h[i+1][j]=max(h[i+1][j],h[i][k]+f[G[x][i]][l*C[x][i]][j-k]);
					}
				}
			}
			for(int i=0;i<=l;i++){
				for(int j=0;j<=m;j++){
					f[x][i][j]=max(f[x][i][j],h[G[x].size()][j]+A[x]*(l-i));
				}
			}
		}
	}
}
inline void work(){
	int ans=0;
	for(int i=1;i<=n;i++){
		if(ind[i]==0){
			dfs(i);
			for(int j=0;j<=L[i];j++){
				for(int k=0;k<=m;k++){
					ans=max(ans,f[i][j][k]);
				}
			}
		}
	}
	printf("%d\n",ans);
}
int main(){
	freopen("bzoj_1017.in","r",stdin);
	freopen("bzoj_1017.out","w",stdout);
	init();
	work();
	return 0;
}