树形dp
树形dp
$op, f[i+1][u]+=f[i][v], u<-v$
https://ac.nowcoder.com/acm/contest/109081/E
最大独立集:选择的节点不相邻,其中的最大值
$i:节点,j:是否选择当前节点$
$dp[u][0]=0,dp[u][1]=w[u],后序遍历$
$dp[u][0]+=max(dp[v][1],dp[v][0]);$
$dp[u][1]+=dp[v][0]$
最小点覆盖:选最少的节点使得所有边至少有一个端点选择
以u为根节点的子树,不选u就必须选v,选u可选可不选v
$dp[u][0]+=dp[v][1]$
$dp[u][1]+=min(dp[v][1],dp[v][0])$
最小点覆盖=总节点数−最大独立集
树的直径:最长路径
记录每个节点上的最大值与次大值
树的中心:该结点离树中的其他结点,最远距离最近。
在直径上,存最大边与次大边
树形背包
AcWing 10. 有依赖的背包问题(思路不同于dxc,但是个人感觉更好理解) - AcWing
//01背包的逆序遍历,a<b<c;求c时会用到a,此时的a不是c的上层
for(int i=siz[u];i>=0;i--)//容积
{
for(int j=0;j<=siz[v];j++)
{
dp[u][i]=max(dp[u][i],dp[u][i-j]+dp[v][j]);
}
}
siz:u<-v
对有权值的边做dfs
i->i-1,dp[u][i]=max(,dp[u][i-j]+dp[v][j]+w);
最大子树和
dp[u]=max(dp[u],0);
浙公网安备 33010602011771号