标签:状态 20191110luogu3698 max 枚举 too 步数 dp 贪心
题意:
求从树的根节点出发,走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,max,枚举,too,步数,dp,贪心 来源: https://www.cnblogs.com/djfuuxjz/p/11831742.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。