P1122 最大子树和(树形动态规划)

这篇博客分享了解决Luogu P1122问题的两种树形动态规划方法。第一种方法通过建立边的关系,使用动态规划计算以每个节点为根的最大价值数f[x]和g[x]。状态转移方程包括value[x]+∑max(0,g[x])和max(f[y])。第二种方法也是类似的状态转移,但采用宽度优先搜索逐步更新每个父节点的最大价值数。" 117507777,10553131,Android Studio 依赖管理全攻略,"['Android开发', 'Android Studio', '依赖库', 'Gradle构建']
摘要由CSDN通过智能技术生成

题干在这里:https://www.luogu.org/problemnew/show/P1122

本题老师教了我两种方法,和大家分享一下,希望能帮到大家~~~

第一种思路:
由于每两个点之间都有一些联系,我们可以先把两两之间的关系用边的形式储存下来:

  1. head[x]是表示与x相连的第一个元素的下标
  2. edge[x].po是表示链头为x
  3. edge[x].next是表述链头是x,与x相连的元素的下标
  4. 运作方法:每读入一个数k,就将head[x]转变为k,之后再由edge数组转变下去,这样就将k与整个链连接起来了

动态规划总是要有状态转移方程的,我们用f[x]表示以x为根的最大价值数(其实就是题目中所谓的美丽指数,只不过这个名字太奇怪了。。。)。用g[x]表示以x为根,并且一定要取x的最大价值数
先考虑g[x]的状态转移方程:

value[x]+∑max(0,g[x]);

考虑f[x]是否取x:
如果不取,那么和他相连的子树都可以取,状态转移方程是(其中y具体取值请参看本人的代码):

max(f[y]);

而且一定要求两种情况的最大值!!!并且所有的f[x]d都要附一个足够小的数才行(本蒟蒻在这里卡了一个小时,望大家注意!!!)

当x是根的时候,需要用到它的子树列,用深搜就可以实现。深搜有两个参数:x表示处理的对象,fa表示该对象的父亲(之后是不能再回到fa的!!)

最后献上代码~~~

#include<iostream>
const int maxN=20000;
const int minvalue=-2147483647;
using 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值