社区讨论
样例不过求调
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 条回复,欢迎继续交流。
正在加载回复...