社区讨论

样例不过求调

P4037[JSOI2008] 魔兽地图参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mhjog69z
此快照首次捕获于
2025/11/04 05:53
4 个月前
此快照最后确认于
2025/11/04 05:53
4 个月前
查看原帖
思路同https://www.luogu.com.cn/article/xw4q2qug
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int,int>
const int N=57,M=2007,K=107;
char c;
int a[N],f[N][K][M],ans[M],tmp[M],up[N],w[N],rt[N];
vector<pii>v[N];
int n,m,k,cnt,pos,sum,mx=-1e9,x,y,q,opt,l,r,mid;
void dfs(int x){
	if(!v[x].size()){
		up[x]=min(up[x],m/w[x]);
		for(int i=0;i<=up[x];i++){
			for(int j=0;j<=i;j++)f[x][j][i*w[x]]=a[x]*(i-j);
		}
	}
	else{
		up[x]=1e18;
		for(pii i:v[x]){
			dfs(i.first);
			up[x]=min(up[x],up[i.first]/i.second);
			w[x]+=w[i.first]*i.second;
		}
		up[x]=min(up[x],m/w[x]);
		for(int i=0;i<=up[x];i++){
			for(int j=1;j<=m;j++)tmp[j]=-1e18;
			for(pii j:v[x]){
				for(int k=m;k>=0;k--){
					for(int l=0;l<=k;l++)tmp[k]=max(tmp[k],tmp[k-l]+f[j.first][i*j.second][l]);
				}
			}
			for(int j=0;j<=i;j++){
				for(int k=m;k>=0;k--)f[x][j][k]=max(f[x][j][k],tmp[k]+a[x]*(i-j));
			}
		}
	}
}
signed main(){
	cin>>n>>m,memset(f,-0x3f,sizeof(f));
	for(int i=1;i<=n;i++)rt[i]=1;
	for(int i=1;i<=n;i++){
		cin>>a[i]>>c;
		if(c=='A'){
			cin>>k;
			while(k--)cin>>y>>l,rt[y]=0,v[i].push_back({y,l});
		}
		else cin>>w[i]>>up[i];
	}
	for(int i=1;i<=n;i++){
		if(rt[i]){
			dfs(i);
			for(int j=m;j>=0;j--)for(int k=0;k<=j;k++)ans[j]=max(ans[j],ans[j-k]+f[i][0][k]);//,cout<<f[i][0][k]<<" ";
		}
	}
//	for(int i=1;i<=n;i++){
//		for(int j=0;j<=i;j++){
//			for(int k=0;k<=m;k++){
//				if(f[i][j][k]<0)f[i][j][k]=-1;
//				cout<<f[i][j][k]<<" ";
//			}cout<<"\n";
//		}cout<<"\n";
//	}
	cout<<ans[n];
	return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...