LeetCode-二叉树染色 动态规划+深度优先搜索

题目描述:LeetCode-二叉树染色本题使用动态规划+深度优先搜索解法首先需要有一个大致的解题方向:本题是针对二叉树的最优化(求最大值最小值问题),对于最优化问题,一般想到采用动态规划解法。但是有了大致方向,具体的步骤——设计状态转移方程以及方程的初始值的确定依然是难点。这记录一下我参考学习 官网的题解后的解法对于二叉树中的每个节点,都有染色或不染色两种选择。对于每个节点node我们构建一维动规表dp[k+1],表长度为k+1,其中dp[0]存储不染色情况下以节点node为根的子树的最大价值;当i&
摘要由CSDN通过智能技术生成

题目描述:LeetCode-二叉树染色

本题使用动态规划+深度优先搜索解法

首先需要有一个大致的解题方向:本题是针对二叉树的最优化(求最大值最小值问题),对于最优化问题,一般想到采用动态规划解法。但是有了大致方向,具体的步骤——设计状态转移方程以及方程的初始值的确定依然是难点。这记录一下我参考学习 官网的题解后的解法

对于二叉树中的每个节点,都有染色或不染色两种选择。对于每个节点node我们构建一维动规表dp[k+1],表长度为k+1,其中dp[0]存储不染色情况下以节点node为根的子树的最大价值;当i>0时,dp[i]存储包括节点node在内连续i个节点染色的情况下的子树最大价值。

计算dp中的值,需要当前节点node的左右子树的动规结果,分别称为lr。当节点node不染色,dp[0]lr的最大值之和;当节点node染色,有dp[1~k]k种情况,每个dp[i]考虑左子树染色j(0<=j<=i-1)的情况,同时右子树染色i-1-j,取其中的最大值,即dp[i]=max(node.val+l[j]+r[i-j-1])

因此dp方程为:

//对于节点为空情况
dp[i]=0    // i>=0 && i<=k

//对于节点不为空的情况
dp[0]=max(l)+max(r)
dp[i]=max(node.val+l[j]+r[i-j-1])  //i>0 && i<=k, j>=0 && j<i

确定好每个节点的动规表dp,我们用深度优先方法进入二叉树最底层节点,再自底向上并返回每个节点的dp,直到根节点。

题解代码:

class TreeNode {
   
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x) 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值