换根DP的细节

[USACO12FEB]Nearby Cows G

一道换根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);
	}
}
posted @ 2022-06-21 08:25  Feyn618  阅读(28)  评论(0编辑  收藏  举报