void dp(int xx,int fa){
int i,j,k;
sz[xx]=1,f[xx][0]=f[xx][1]=1;
for(i=head[xx];~i;i=q[i].nxt){
int v=q[i].to;
if(v!=fa){
dp(v,xx);
sz[xx]+=sz[v];
for(j=sz[xx];j>=1;j--){
for(k=max(0,sz[v]-sz[xx]);k<=min((S)(j-1),sz[v]);k++){
f[xx][j]=max(f[xx][j],f[xx][j-k]*f[v][k]);
}
}
}
}
for(i=1;i<=sz[xx];i++){
f[xx][0]=max(f[xx][0],f[xx][i]*i);
}
}
交换了j-k和k的位置,下面代码AC
void dp(int xx,int fa){
int i,j,k;
sz[xx]=1,f[xx][0]=f[xx][1]=1;
for(i=head[xx];~i;i=q[i].nxt){
int v=q[i].to;
if(v!=fa){
dp(v,xx);
sz[xx]+=sz[v];
for(j=sz[xx];j>=1;j--){
for(k=min(j,sz[xx]-sz[v]);k>=max(1,j-sz[v]);k--){
f[xx][j]=max(f[xx][j],f[xx][k]*f[v][j-k]);
}
}
}
}
for(i=1;i<=sz[xx];i++){
f[xx][0]=max(f[xx][0],f[xx][i]*i);
}
}