首页 > 其他分享 >代码随想录训练营第39天|树形dp

代码随想录训练营第39天|树形dp

时间:2024-09-22 09:22:17浏览次数:13  
标签:39 right nums int rob 随想录 root dp left

198. 打家劫舍

class Solution {
public:
    int rob(vector<int>& nums) {
        nums.insert(nums.begin(),0);
        int n=nums.size();
        vector<int> dp(n,INT_MIN);
        dp[0]=0;
        dp[1]=nums[1];
        for(int i=2; i<n; i++){
            dp[i]=max(dp[i-1],dp[i-2]+nums[i]);
        }
        return dp[n-1];
    }
};

dp[i]:截止下标i(包含i)的房子,所能打劫的最大金额

转移方程:考虑nums[i]是否被打劫,只有两种可能:

  • 抢,那么为了不触发警报,nums[i-1]一定不能被打劫,只能从i-2转移而来
  • 不抢,则nums[i-1]可以被抢,最大金额就等于dp[i-1]

引入空房间作为虚拟头,初始化更简单,且不影响最终结果。

213. 打家劫舍 II

class Solution {
public:
    int rob_range(vector<int>& nums, int left, int right) {
        if(left==right)
            return nums[left];
        int n=nums.size();
        vector<int> dp(nums.size(),INT_MIN);
        dp[left]=nums[left];
        dp[left+1]=max(nums[left+1],nums[left]);
        for(int i=left+2; i<=right; i++){
            dp[i]=max(dp[i-1],dp[i-2]+nums[i]);
        }
        return dp[right];
    }
    int rob(vector<int>& nums) {
        if(nums.size()==1)
            return nums[0];
        int amount1=rob_range(nums,0,nums.size()-2);
        int amount2=rob_range(nums,1,nums.size()-1);
        return max(amount1,amount2);
    }
};

上题的变种,题目可以拆分为两种情况:抢第一间或不抢第一间。分别处理取最大即可

337. 打家劫舍 III

class Solution {
public:
    pair<int,int> rob_tree(TreeNode* root){
        if(root==nullptr)
            return {0,0};
        auto [left_0, left_1]=rob_tree(root->left);
        auto [right_0, right_1]=rob_tree(root->right);
        int root_1=root->val+left_0+right_0;
        int root_0=max(left_0,left_1)+max(right_0,right_1);
        return {root_0,root_1};
    }
    int rob(TreeNode* root) {
        auto [root_0, root_1]=rob_tree(root);
        return max(root_0,root_1);
    }
};

状态转移:定义rob_tree返回的是pair:{不抢根的最大值,抢根的最大值}

采用后续遍历,利用子树的结果构建当前结果,也是分治的思想,即把当前问题拆解为规模更小的子问题,直到空树,一定为{0,0}。

对于当前层的计算逻辑,分两种情况:

  • 抢根,这时子树的根一定不能抢,否则触发报警,所以此时金额为root->val+left_0+right_0
  • 不抢根,这时子树的选择就随意了,不论子树抢或者不抢,均不会触发警报,所以分别取最大值即可:max(left_0,left_1)+max(right_0,right_1)

标签:39,right,nums,int,rob,随想录,root,dp,left
From: https://blog.csdn.net/jiyisuifeng1991/article/details/142410455

相关文章

  • 数位dp 不要62
    纯纯数位dp板子,可以顺着思路下来。传统技能学习笔记不要62libreoj设状态为\(dp[i][j]\)为第\(i\)位是\(j\)的可能情况数。枚举位数,这位的数,低一位的数,将每一位的组合可能存下来,但要把这位是4与这位是6低一位是2的情况排除掉。voidinit(){ dp[0][0]=1; for(in......
  • 2024ICPC网络赛(2)-K.Match——匹配、奇妙的n4 DP
    题目:https://qoj.ac/contest/1799/problem/9380题意:给两个长度为\(n\)的序列\(a,b\),若\(a_i\oplusb_j\geqk\)则连一条左侧\(i\)到右侧\(j\)的边,这样得到一张二分图。对于每个\(x=1,\dots,n\),询问大小为\(x\)的匹配的数量。\(1\leqn\leq200\).首先要知道一般二......
  • 数字产品护照 (DPP) 解决方案:利用 Blazor 和区块链实现产品全生命周期追踪
    数字产品护照(DPP)解决方案:利用Blazor和区块链实现产品全生命周期追踪随着全球对可持续发展和产品透明度的关注日益增加,企业需要一种可靠的方法来跟踪和管理产品生命周期中的关键数据。我们的数字产品护照(DigitalProductPassport,DPP)系统正是为此而生,提供了一种安全透明的方......
  • 基于UDP的网络编程
    基于UDP的网络编程@[toc]使用基于UDP的网络编程方法,完成远程计算等差数列的前n项和功能(1)客户端将一等差数列的首项a1,公差d和项数n发送给服务器;(2)服务器端接收到数据后对接收到的数据进行解析,将前n项和的计算结果发送给客户端;(3)客户端收到后输出到控制台。UDPSenderpackageMoocPart......
  • 【代码随想录Day23】回溯算法Part02
    39.组合总和题目链接/文章讲解:代码随想录视频讲解:带你学透回溯算法-组合总和(对应「leetcode」力扣题目:39.组合总和)|回溯法精讲!_哔哩哔哩_bilibiliclassSolution{//存储最终结果的列表List<List<Integer>>result=newArrayList<>();//存储当前路......
  • WordPress 迁移插件终极指南
    迁移WordPress网站就像收拾房子搬到新房子一样。确保所有内容(内容、主题、插件、媒体文件甚至数据库)完美移动且没有任何损坏的挑战似乎令人畏惧。但就像搬家公司让搬家变得更容易一样,WordPress迁移插件简化了将网站从一台主机移动到另一台主机的复杂过程。无论您是切换主机、从......
  • JAVA网络编程【基于TCP和UDP协议】超详细!!!
    ip地址:唯一标识主机的地址端口号:用于标识计算机上某个特定的网络程序InetAddress类方法说明InetAddressInetAddress.getLocalHost()静态方法,获取本机InetAddress对象(主机名+ip地址)InetAddressInetAddress.getByName("主机名")根据主机名或者域名获取ip地址对象(主机名+ip地址......
  • hexo安装后报错'hexo' 不是内部或外部命令,也不是可运行的程序 或批处理文件。
    hexo问题之前利用hexo和gitee搭建了一个博客,但是最近gitee的gitpage停止服务了,便想着在github上搭建一个。在到安装hexo这一步的时候,一直报错'hexo'不是内部或外部命令,也不是可运行的程序或批处理文件。我的所有安装步骤和环境变量发现都没有错,反复配置后去找了一下官方文档:h......
  • 解决QFC810.exe运行时错误:soundplayer.dll文件丢失,恢复音频播放的实用指南
    当遇到QFC810.exe运行时错误,提示soundplayer.dll文件丢失时,这通常意味着你的系统或应用程序目录中缺少了必要的动态链接库文件(DLL),导致音频播放功能无法正常工作。以下是一份恢复音频播放的实用指南:一、确认问题首先,确认错误消息确实是由于soundplayer.dll文件丢失引起的。这......
  • 登录出现 'phome_enewsdolog' 错误 帝国cms
    当你在登录帝国CMS时出现 'phome_enewsdolog' 错误时,这通常意味着在执行登录操作时遇到了数据库相关的问题。以下是一些可能的原因及解决方法:1.检查数据库连接确保数据库连接正常。解决方法:检查数据库配置:打开 e/config/config.php 文件,确认数据库连接信息(如主机名、......