树形动态规划

简介: 树形动态规划


树形动态规划

树形动态规划与线性动态规划没有本质区别

其实只是套在深度优先遍历里的动态规划(在DFS的过程中实现DP)

子问题就是“一棵子树”, 状态一般表示为“以x为根的子树”, 决策就是"x的子结点”

复杂的题目可以在此基础上增加更多与题目相关的状态、决策

实战

337.打家劫舍III

https://leetcode.cn/problems/house-robber-iii/

f[x,0]表示以x为根的子树,在不打劫x的情况下,能够盗取的最高金额

f[x,1]表示以x为根的子树,在打劫x的情况下,能够盗取的最高金额

目标: max(f[root,0], f[root, 1])

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public int rob(TreeNode root) {
        f = new HashMap<TreeNode, int[]>();
        f.put(null, new int[]{0, 0});
        dfs(root);
        return Math.max(f.get(root)[0], f.get(root)[1]);
    }
    private void dfs(TreeNode root) {
        if(root == null) return;
        f.put(root, new int[2]);
        dfs(root.left);
        dfs(root.right);
        f.get(root)[0] = 
            Math.max(f.get(root.left)[0], f.get(root.left)[1]) +
            Math.max(f.get(root.right)[0], f.get(root.right)[1]);
        f.get(root)[1] = 
            f.get(root.left)[0] + f.get(root.right)[0] + root.val;
    }
    HashMap<TreeNode, int[]> f; 
}
class Solution {
public:
    unordered_map <TreeNode*, int> f, g;
    void dfs(TreeNode* node) {
        if (!node) {
            return;
        }
        dfs(node->left);
        dfs(node->right);
        f[node] = node->val + g[node->left] + g[node->right];
        g[node] = max(f[node->left], g[node->left]) + max(f[node->right], g[node->right]);
    }
    int rob(TreeNode* root) {
        dfs(root);
        return max(f[root], g[root]);
    }
};

匈牙利算法

推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习

相关文章
|
2月前
|
开发者
第十二期乘风伯乐奖--寻找百位乘风者伯乐,邀请新博主入驻即可获奖
乘风伯乐奖,面向阿里云开发者社区已入驻乘风者计划的博主(技术/星级/专家),邀请用户入驻乘风者计划即可获得乘风者定制周边等实物奖励。本期面向阿里云开发者社区寻找100位乘风伯乐,邀请人数月度TOP 1 获奖者(大于108人)可获得AirPods2代!
2471 8
|
4月前
|
存储 缓存 固态存储
存储性能软件加速库(SPDK)
存储性能软件加速库(SPDK)
|
4月前
|
设计模式 前端开发 数据中心
设计模式之观察者模式
设计模式之观察者模式
|
4月前
|
NoSQL 容器 消息中间件
番外篇 中国古代的操 作系统
番外篇 中国古代的操 作系统
|
4月前
|
存储 NoSQL Linux
定时器的实现方案:红黑树和多级时间轮
定时器的实现方案:红黑树和多级时间轮
|
4月前
|
前端开发 虚拟化 内存技术
SPDK vhost target
SPDK vhost target
|
4月前
|
存储 芯片 Windows
CHS_01.1.5+操作系统引导
CHS_01.1.5+操作系统引导
|
4月前
|
固态存储 API 内存技术
多看看spdk代码学习
多看看spdk代码学习
|
4月前
|
固态存储 网络协议 Linux
SPDK NVMe-oF Target
SPDK NVMe-oF Target
SPDK NVMe-oF Target
|
4月前
|
存储 RDMA 内存技术
nvmf代码分析
nvmf代码分析