树形动态规划

简介: 树形动态规划


树形动态规划

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

其实只是套在深度优先遍历里的动态规划(在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等技术内容,立即学习

相关文章
|
6月前
|
网络协议 网络虚拟化 数据中心
华为配置VXLAN构建虚拟网络实现相同网段互通示例(静态方式)
配置VXLAN构建虚拟网络实现相同网段互通示例(静态方式
198 0
|
6月前
|
Kubernetes 调度 Docker
Docker 是什么? 和 Kubernetes(k8s) 之间是什么关系?
Docker是将程序和环境打包运行的工具,提供统一的运行环境,解决跨平台部署问题。它基于基础镜像(包含操作系统和语言环境)构建,通过Dockerfile描述构建过程,并生成容器镜像。镜像存储在Registry中,通过pull/push操作分发。容器是从镜像解压出的独立运行实例,类似轻量级虚拟机,但共享宿主机内核。Docker与Kubernetes(k8s)关系:Docker解决单容器部署,Docker Compose管理多容器服务,Docker Swarm实现集群部署,而k8s是容器编排引擎,管理Docker等容器的调度和扩展。
997 7
Docker 是什么? 和 Kubernetes(k8s) 之间是什么关系?
|
26天前
|
编解码 人工智能 自然语言处理
MaskGCT:登上GitHub趋势榜榜首的TTS开源大模型
近日,香港中文大学(深圳)联手趣丸科技推出了新一代大规模声音克隆TTS模型——MaskGCT。一起看看该模型的一些表现吧!
|
1月前
|
监控 Java
MaxGCPauseMillis参数
MaxGCPauseMillis参数
|
3月前
|
自然语言处理 前端开发 Linux
在Linux中,什么是 GUI?
在Linux中,什么是 GUI?
|
3月前
|
缓存 测试技术 网络安全
gitlab ci cd 不完全指南
gitlab ci cd 不完全指南
108 1
|
6月前
|
存储 NoSQL Linux
定时器的实现方案:红黑树和多级时间轮
定时器的实现方案:红黑树和多级时间轮
|
5月前
|
JSON Ubuntu JavaScript
工具分享:VsCode注释神器,koro1FileHeader
工具分享:VsCode注释神器,koro1FileHeader
196 3
|
6月前
|
前端开发 虚拟化 内存技术
SPDK vhost target
SPDK vhost target
|
6月前
|
算法 NoSQL 容器
启发式搜索: A*算法
启发式搜索: A*算法