问题引入
设置dp状态,相比于更容易出错的贪心更...不易出错。
状态设计
如果选择父结点,就会使孩子结点不能被选择,我们会多开一维的dp,用来标记该点是否被标记过。
以1点举例,f[1][0]为不选它的状态,那么它的子结点2 3 是可选可不选的,所以是 max(f[2][0],f[2][1])+max(f[3][0]+f[3][1]) ,在子结点的两个状态里挑最大值,并且子结点间没有限制,所以直接相加。
f[1][1]=f[2][0]+f[3][0]
所以这题的总体思路是:从叶子结点开始,dp[v][0]=0 dp[v][1]=a_v,并且到达根。
最后结果在 dp[root][0] dp[root][0]里挑一个max
void dfs(int u, int fa) { for (int i = head[u]; i; i = edge[i].nex) { int v = edge[i].to; if (v != fa) continue; dfs(v, u); f[u][0] += max(f[v][0], f[v][1]); f[u][1] += f[v][0]; } return ; }
在这里解释一下自上而上:父结点的状态转移方程是会受到孩子状态值的影响。算法进行的方向还是从叶子计算到根。
问题二
状态设计
二维可以解决,将是否选择这个点并入体积里(选了这个点即为多这个点的体积)
状态转移是什么样的?可以把一个子树的几个孩子看成是几个物品,用类似于背包问题进行状态转移。
当前结点u在体积v1下,由体积v1-v2下加上某一孩子的v2体积下价值与它原来的值进行大小对比。所以我们会对v1 v2进行枚举。
虽然我们类比了01背包,但是和01背包问题相比,某一个子树的体积不是某个定值,而是会从0到最大限度进行枚举。
void dfs(int u, int fa) { memset(f[u], -0x3f, sizeof f[u]); if (v[u] <= V) f[u][v[u]] = w[u]; //把当前结点放进去,以u为根的子树里,还只放入了结点u for (int i = head[u]; i; i = edge[i].nex) //枚举每一个子树 { int v = edge[i].to; if (v == fa) continue; dfs(v, u); //从叶子开始, //,每个孩子结点看成不同的物品,进行01背包 vectornf(f[u], f[u] + V + 1); //当前子树的背包过程,用来转移 for (int v1 = 0; v1 <= V; v1 ++) //含义:在放入这个子树前,已使用的体积 { for (int v2 = 0; v1 + v2 <= V; v2 ++ ) //放入v2后不能超过V { nf[v1 + v2] = max(nf[v1 + v2], f[u][v1] + f[v][v2]); } } for (int v = 0; v <= V; v ++ ) f[u][v] = nf[v]; } return ; }
问题二进阶
siz[u] 是指,把包含u在内,u为根的子树,把所有权值都加上,得到的和。
虽然还是两层for,但是如果在每个结点都体积为1的情况下,相当于是把以u为子树的每个结点两两进行比较。
猜你喜欢
- 13天前(希尔顿2021活动)希尔顿集团618盛夏大促开启
- 13天前(中旅酒店 维景)中旅酒店首次AI数字人直播亮相南京维景
- 13天前(罗马尼亚的匈牙利族自治)江苏赴匈牙利、罗马尼亚开展文旅交流推广活动
- 13天前(甘肃文化旅游宣传片)甘肃文旅推介走进重庆
- 13天前(重庆恐龙化石遗址)重庆黔江恐龙化石抢救性发掘新闻发布会举行
- 13天前(云南滇陇工程咨询有限公司)陇滇携手谋发展 文旅合作谱新篇
- 13天前(曼谷丽思卡尔顿公寓价格)曼谷丽思卡尔顿酒店盛大启幕,开创泰国奢华雅致新纪元
- 13天前(中国最好的避暑山庄)2025中国十大避暑山庄评选揭晓,澳涞山庄夺魁
- 13天前(芜宣机场国际航班)新华丝路:芜宣机场开通至越南首都河内的国际货运航线
- 13天前(北京香港航班动态查询)香港快运航空北京大兴新航线今日首航
网友评论
- 搜索
- 最新文章
- (2020广州车展哈弗)你的猛龙 独一无二 哈弗猛龙广州车展闪耀登场
- (哈弗新能源suv2019款)智能科技颠覆出行体验 哈弗重塑新能源越野SUV价值认知
- (2021款全新哈弗h5自动四驱报价)新哈弗H5再赴保障之旅,无惧冰雪护航哈弗全民电四驱挑战赛
- (海南航空现况怎样)用一场直播找到市场扩张新渠道,海南航空做对了什么?
- (visa jcb 日本)优惠面面俱到 JCB信用卡邀您畅玩日本冰雪季
- (第三届“堡里有年味·回村过大年”民俗花灯会活动)第三届“堡里有年味·回村过大年”民俗花灯会活动
- (展示非遗魅力 长安启源助力铜梁龙舞出征)展示非遗魅力 长安启源助力铜梁龙舞出征
- (阿斯塔纳航空公司)阿斯塔纳航空机队飞机数量增至50架
- (北京香港航班动态查询)香港快运航空北京大兴新航线今日首航
- (我在港航“呵护”飞机 每一次安全着陆就是最好的荣誉)我在港航“呵护”飞机 每一次安全着陆就是最好的荣誉
- 热门文章