20191110luogu3698小Q的棋盘 | 树形背包dp | 贪心

Posted djfuuxjz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了20191110luogu3698小Q的棋盘 | 树形背包dp | 贪心相关的知识,希望对你有一定的参考价值。

luogu3698小Q的棋盘

题意:

求从树的根节点出发,走n步能经过的最多的点的数量(可以重复走点,但是重复走的步数会记录)

树形背包dp:

对于从0出发,我们可以这样走:

1、选一条岔路一直走下去

2、选一条岔路走后回到0点,再选一条岔路走下去

对应的dp转移:

f[0][u][j]代表从u出发走j步不一定回到u点能到达的最大步数

f[1][u][j]代表从u出发走j步回到u点能到达的最大步数

f[0][u][j] = max(f[0][u][j],f[0][u][k] + f[1][too][j - k - 2])//2状态,选too的路径并走回too,再走回u,从u再选一条新路径走下去

f[0][u][j] = max(f[0][u][j],f[1][u][k] + f[0][too][j - k - 1])//2状态,选某路径走个往返,再走回u,从u选择从too走下去(注意这个状态和上一个不一样,必须要讨论这两种情况)

f[1][u][j] = max(f[1][u][j],f[1][u][k] + f[1][too][j - k - 2]);//1状态

需要注意的是j一定要从大到小倒序枚举,因为我们的状态是由小到大转移的,所以为了避免重复转移状态,j从小到大枚举

还需注意的是k需要从0开始枚举,因为我们初始化f[0][u][0]= f[1][u][0] = 1,需要利用上初始状态

贪心:

可以证明的是我们一定会走从0出发的最长链

因为明显最优的就是不用往回走

当n大于最长链长度时,我们再考虑往回走的问题,每多经过一个点,需要的步数+2(一来一回),直接计算即可

当n小于等于最长链长度时,直接输出步数+1(包含根节点)

 

以上是关于20191110luogu3698小Q的棋盘 | 树形背包dp | 贪心的主要内容,如果未能解决你的问题,请参考以下文章

luogu 1169 棋盘制作(单调栈/悬线)

[luogu P1169] [ZJOI2007]棋盘制作

[luogu]P1169 [ZJOI2007]棋盘制作[DP][单调栈]

重庆OI2017 小 Q 的棋盘

BZOJ1057:[ZJOI2007]棋盘制作——题解

bzoj4813[Cqoi2017]小Q的棋盘 dfs+贪心