动态规划之树形结构的状态转移方程

本文介绍了一种动态规划方法解决树形结构问题,目标是找到最大权值和,但不能同时选择有父子关系的节点。通过定义f(o)和g(o)分别表示节点o选中和不选中时子树的最大权值和,利用后序遍历和哈希映射求解。算法的时间复杂度和空间复杂度均为O(n)。最后提出优化方案,通过返回子节点的f和g值避免使用哈希映射节省空间。
摘要由CSDN通过智能技术生成

leetcode 题目
方法一:动态规划
思路与算法

简化一下这个问题:一棵二叉树,树上的每个点都有对应的权值,每个点有两种状态(选中和不选中),问在不能同时选中有父子关系的点的情况下,能选中的点的最大权值和是多少。

我们可以用 f(o)f(o) 表示选择 o 节点的情况下,o 节点的子树上被选择的节点的最大权值和;g(o)g(o) 表示不选择 o 节点的情况下,o 节点的子树上被选择的节点的最大权值和;l 和 r 代表 o 的左右孩子。

当 o 被选中时,o 的左右孩子都不能被选中,故 o 被选中情况下子树上被选中点的最大权值和为 ll和 r 不被选中的最大权值和相加,即 f(o) = g(l) + g®f(o)=g(l)+g®。
当 o 不被选中时,o 的左右孩子可以被选中,也可以不被选中。对于 o 的某个具体的孩子 x,它对 o 的贡献是 x 被选中和不被选中情况下权值和的较大值。故 g(o) = \max { f(l) , g(l)}+\max{ f® , g® }g(o)=max{f(l),g(l)}+max{f®,g®}。
至此,我们可以用哈希映射来存 ff和 g 的函数值,用深度优先搜索的办法后序遍历这棵二叉树,我们就可以得到每一个节点的 f 和 g。根节点的 f 和 g 的最大值就是我们要找的答案。

class Solution {
   
public:
    unordered_map <TreeNode*, int> f, g;

    void dfs(TreeNode* o) {
   
        if (!o) {
   
            return;
        }
        dfs(o->left
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值