小Q的棋盘

我们先按树形DP做

我们模拟一下如何走,会发现有可能会先从根节点往下走,然后回到根节点,再从根节点继续往下走,这个过程甚至可以重复多次

所以我们会发现很重要的一点就是是否回到根节点,所以我们设\(f[i][j][0/1]\)表示根节点是\(i\),走\(j\)步,终点是不是根节点的最多走的点数(注意这里没必要把终点具体是什么设出来,一是复杂度会爆炸,二是我们这个状态能推走肯定用更简单的状态,所以说以后设出具体终点不行的时候我们就尝试选择一个最重要的终点来设状态)

于是有

当然我们多模拟几遍就会发现一个很重要的东西,如果我们给定了要走的点(具体的,比如说给了一颗具体的树),然后问全部点都走一遍最少要用多少步

这个模型其实以前经常遇到过,答案就是点数\(\times 2-\)最长链的长度(答案下界+构造合理方案)

于是乎,我们求出从根节点出发的最长链,设长度为\(y\),如果\(y≥N\),则答案显然为\(N+1\),如果说\(y≤N\),则答案为\(min(n,\lfloor \frac{N+y}{2}\rfloor +1)\)

后面这一个的来源见下

update 2024.6.30

后面一种做法的代码见hydrobzoj,可以分的更细一点

如果\(y≥N\),则答案显然为\(N+1\)

如果\(2(n-1)-y≤N\),就说明每个点都可以被走一遍,于是答案为\(n\)

如果\(y<N<2(n-1)-y\),显然可以选出原树的一个子树使得在\(N\)步全走完的情况下,停在这条最长链的终点(或者终点前一个点),把这个子树看成下面这个样子就好了

这条最长链的每条边都只会经过一遍,然后分支的每条边都会经过两遍,于是\(N\)每次从链的某一点进入某个分支再回到这一点减少的量一定是偶数,于是将\(N\)调整到\(y\)或者\(y-1\)即可

update 2024.8.31

第一种想法来源于树形DP的一般决策。我们考虑现在已经决策了的子节点集合为\(S\),对于新的一个子节点\(v\),我们考虑\(S∪{v}\)的最佳方案是什么,就可以想到上面的DP(这种考虑DP的决策的思想在一些不好证明的区间DP中也有应用)

第二种想法来源于树的直径。看到“最远”就可以往树的直径上面想,最后那个式子可以简单理解为:最长链的每一条边走一次,还剩下\(N-y\)步,其余分叉的边至少走两次,除以\(2\)即可

posted @ 2024-01-27 22:56  最爱丁珰  阅读(2)  评论(0编辑  收藏  举报