小Q的棋盘

我们先按树形DP做

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

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

于是有

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

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

于是乎,我们求出从根节点出发的最长链,设长度为y,如果yN,则答案显然为N+1,如果说yN,则答案为min(n,N+y2+1)

后面这一个的来源见下

update 2024.6.30

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

如果yN,则答案显然为N+1

如果2(n1)yN,就说明每个点都可以被走一遍,于是答案为n

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

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

update 2024.8.31

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

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

posted @   最爱丁珰  阅读(3)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示