awa

baim.  •  4个月前


`#include

include

include

include

include

include

include

include

include

using namespace std;

define int long long

define INF 0x3f3f3f3f3f3f3f3f

define N (int)(55)

define SZ (int)(2e3+15)

int n,m; int P[N],M[N],L[N],tmp[SZ],h[SZ],f[N][105][SZ],g[SZ]; struct Edge {

int u,v,w,next;

}e[N*N]; int pos=1,head[N],in[N]; void addEdge(int u,int v,int w) {

e[++pos]={u,v,w,head[u]};
head[u]=pos;++in[v];

} void DP(int u) {

if(!head[u])
{
    L[u]=min(L[u],m/M[u]);
    for(int i=0; i<=L[u]; i++)
        for(int j=i; j<=L[u]; j++)
            f[u][i][j*M[u]]=(j-i)*P[u]; 
    return;
}
L[u]=INF;
for(int i=head[u]; i; i=e[i].next)
{
    int v=e[i].v; DP(v);
    L[u]=min(L[u],L[v]/e[i].w);
    M[u]+=e[i].w*M[v];
}
L[u]=min(L[u],m/M[u]);
for(int l=0; l<=L[u]; l++)
{
    memset(g,0xc0,sizeof(g));
    g[0]=0;
    for(int i=head[u]; i; i=e[i].next)
    {
        int v=e[i].v,w=e[i].w;
        for(int j=0; j<=m; j++)
            tmp[j]=g[j],g[j]=-INF;
        for(int j=0; j<=m; j++)
            for(int k=0; tmp[j]>=0&&j+k<=m; k++)
                g[j+k]=max(g[j+k],tmp[j]+f[v][l*w][k]);
    }
    for(int j=0; j<=l; j++)
        for(int k=0; k<=m; k++)
            f[u][j][k]=max(f[u][j][k],g[k]+(l-j)*P[u]);
}

} signed main() {

ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin >> n >> m;
memset(f,0xc0,sizeof(f));
for(int i=1,l; i<=n; i++)
{
    char ch;
    cin >> P[i] >> ch;
    if(ch=='A')
    {
        cin >> l;
        for(int j=1,v,w; j<=l; j++)
            cin >> v >> w,addEdge(i,v,w);
    }
    else cin >> M[i] >> L[i];
}
for(int u=1; u<=n; u++)
{
    if(!in[u]) // 森林
    {
        DP(u);
        for(int i=0; i<=m; i++)
            tmp[i]=h[i],h[i]=0;
        for(int i=0; i<=m; i++)
            for(int j=0; i+j<=m; j++)
                h[i+j]=max(h[i+j],tmp[i]+f[u][0][j]); 
    }
}
int res=-INF;
for(int i=0; i<=m; i++)
    res=max(res,h[i]);
cout << res << '\n';
return 0;

}`


评论: