一个好问题
查看原帖
一个好问题
936132
Desolator楼主2024/11/5 09:17

本题中,为什么不能先算出每个子树 size 再进行 dpdp

错误代码如下:

void dfs(int u){
    dp[u][1]=val[u];
    if(val[u]) sz[u]=1;
    for(PI tmp:ver[u]){
        int v=tmp.fir,w=tmp.sec;
        dfs(v);
        sz[u]+=sz[v];
    }
    for(PI tmp:ver[u]){
        int v=tmp.fir,w=tmp.sec;
        for(int i=sz[u];i>0;--i) for(int j=1;j<=i&&j<=sz[v];++j){
            dp[u][i]=max(dp[u][i],dp[u][i-j]+dp[v][j]-w);
        }
    }
}

观察题解发现正确代码如下:

int dfs(int u){
    if(u>n-m){dp[u][1]=val[u];return 1;}
    int sz=0;
    for(PI tmp:ver[u]){
        int v=tmp.fir,w=tmp.sec;
        int s=dfs(v);
        sz+=s;
        for(int i=sz;i>0;--i) for(int j=1;j<=i&&j<=s;++j){
            dp[u][i]=max(dp[u][i],dp[u][i-j]+dp[v][j]-w);
        }
    }
    return sz;
}
2024/11/5 09:17
加载中...