本题中,为什么不能先算出每个子树 size 再进行 dp ?
错误代码如下:
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;
}