树型动态规划
状态定义:f[i]表示以i为根的树上从i点向下能得到的最长链。
f[i]=max(f[son]+W[i,son] ),W表示i点到它对应儿子的边长
DP[i]表示以i为根的树的最长链(包括过节点i和不过节点i的最长链)
DP[i]=max(DP[son],max(f[son1]+f[son2]+W[i][son1]+W[i][son2]))
说白了:
有两种情况:
一、最长链不经过i号节点。
二、最长链经过i号节点。
明显用动归
大概方法
状态
每一棵树是一个状态,即用那个点作为根
阶段
真的不好说,一定要说就是树的大小了,向下
求解方法
递归
给出DP的代码
int DP(int a,int b)
{
if(used[a][b]!=inf) return used[a][b];
used[a][b]=0;
int ans=0;
for(int i=head[a];i;i=f[i].next)
{
int t=DP(f[i].go,0);
if(b==0) t=max(t,DP(f[i].go,1));
ans+=t;
}
ans+=b*d[a];
used[a][b]=ans;
return ans;
}