记录编号 |
144721 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[JSOI 2008]魔兽地图 |
最终得分 |
100 |
用户昵称 |
天一阁 |
是否通过 |
通过 |
代码语言 |
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;
}