给出几个点的树,节点编号为 1 到 n,根节点为 1,每个节点有一个权值。
考虑树形dp,为每一个节点作为链的最高节点来代表其对应的最长链,其在链中前后的节点都是它的子节点,维护它对应链的链长。
由于它有前后两个方向,有两种类型的递增,所以共有4个状态,假设f[u][0], g[u][0]
是分别是子节点权值大于等于节点u的链中前面节点对应的最长链长和次长链长,f[u][1], g[u][1]
是分别是子节点权值小于等于节点u的链中前面节点对应的子链链长和后面节点对应的子链链长。
维护链长可以通过子节点的最长链来更新父节点的最长链和次长链(对应前和后),由于前面节点和后面节点不能是同一个,所以只需要子节点的最长链做更新即可。
初始时所有节点的链长都是1,然后从根节点开始dfs,更新链长,最后取最长链即可。