换根DP的细节
一道换根DP的板子。但是通过这道题发现了我的一些错误代码细节。
一主要就是对于第二遍DFS的过程中对于自己的第二维(也就是距离那维)应当倒序枚举。因为你要保证你调用自己的某个值时这个值是正确的,又因为只会调用比自己小的dp值,所以倒序枚举就可以避免这个错误(就和一维的01背包一个道理)。
应该是这么写:
void solve2(int wh,int fa){
if(fa){
for(int i=n;i>=2;i--){
f[wh][i]+=f[fa][i-1]-f[wh][i-2];
}
f[wh][1]+=a[fa];
}
for(int i=head[wh],th;i;i=e[i].next){
if((th=e[i].t)==fa)continue;
solve2(th,wh);
}
}
一如既往,万事胜意