代码随想录 day 39 动态规划 打家劫舍

news2024/9/21 16:37:05

第九章 动态规划part07

今天就是打家劫舍的一天,这个系列不算难,大家可以一口气拿下。

198.打家劫舍

视频讲解:https://www.bilibili.com/video/BV1Te411N7SX
https://programmercarl.com/0198.%E6%89%93%E5%AE%B6%E5%8A%AB%E8%88%8D.html

213.打家劫舍II

视频讲解:https://www.bilibili.com/video/BV1oM411B7xq
https://programmercarl.com/0213.%E6%89%93%E5%AE%B6%E5%8A%AB%E8%88%8DII.html

337.打家劫舍III

视频讲解:https://www.bilibili.com/video/BV1H24y1Q7sY
https://programmercarl.com/0337.%E6%89%93%E5%AE%B6%E5%8A%AB%E8%88%8DIII.html

198.打家劫舍

题目链接

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

解题思路

经典dp问题
当前房屋偷与不偷取决于 前一个房屋和前两个房屋是否被偷了。
所以这里就更感觉到,当前状态和前面状态会有一种依赖关系,那么这种依赖关系都是动规的递推公式。
1.确定dp数组以及下标的含义
dp[i]:下标i以及i之前的房屋,最多可以偷窃的金额是dp[i]
2.确定递推公式
这里就是偷不偷i 偷:dp[i-2]+nums[i] 不偷:dp[i-1] 取最大值
dp[i]=Math.max(dp[i-2]+nums[i],dp[i-1]);
3.如何初始化dp数组
根据递推公式是dp[i-2] dp[i-1] 那么一定要初始化dp[0]和dp[1]
dp[0]一定是nums[0]
从dp[i]的定义上来讲 如果只有0 1 dp[1] 就是取nums[0]和nums[1] 的最大值
可以自己举例 数组{0,1} {0 ,1,2} {0 ,1,2,3}
4.确定遍历顺序 dp[i] 是根据dp[i - 2] 和 dp[i - 1] 推导出来的,那么一定是从前到后遍历
5.打印dp数组
image.png

code

class Solution {
    public int rob(int[] nums) {
        if(nums.length==0){
            return 0;
        }
        if(nums.length==1){
            return nums[0];
        }
        int[] dp=new int[nums.length];
        dp[0]=nums[0];
        dp[1]=Math.max(nums[0],nums[1]);
        for(int i=2;i<nums.length;i++){
            dp[i]=Math.max(dp[i-2]+nums[i],dp[i-1]);
        }
        return dp[nums.length-1];
    }
}

213.打家劫舍II

题目链接

https://leetcode.cn/problems/house-robber-ii/description/

解题思路

情况一:考虑不包含首尾元素
情况二:考虑包含首元素,不包含尾元素
情况三:考虑包含尾元素,不包含首元素
而情况二 和 情况三 都包含了情况一了,所以只考虑情况二和情况三就可以了
省下就是抽离打家劫舍I的代码 调用 取最大值就可以了。

code

class Solution {
    public int rob(int[] nums) {
        if(nums.length==0){
            return 0;
        }
        if(nums.length==1){
            return nums[0];
        }
        int res1=robRange(nums,1,nums.length-1);
        int res2=robRange(nums,0,nums.length-2);
        return Math.max(res1,res2);
    }

    public int robRange(int[] nums,int start,int end){
        if(start==end) return nums[start];
        int[] dp=new int[nums.length];
        dp[start]=nums[start];
        dp[start+1]=Math.max(nums[start],nums[start+1]);
        for(int i=start+2;i<=end;i++){
            dp[i]=Math.max(dp[i-2]+nums[i],dp[i-1]);
        }
        return dp[end];
    }
}

337. 打家劫舍 III

题目链接

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

解题思路

dp[i] 当前节点偷或不偷 只有俩个状态用dp[0]表示不偷dp[1]表示偷 的最大值
树形遍历一定是后序,因为要计算跟节点的值
递推公式就是
偷当前节点:当前节点的值+ 不偷左右孩子的值
不偷当前节点:左孩子偷或不偷的最大值 + 右孩子偷或不偷的最大值
最终就是后序遍历一层一层返回给跟节点计算出根结点偷或不偷的最大值

code

/**
 * 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 {
    //树形dp dp[0] dp[1] 0是不偷  1是偷
    //当前节点偷或者不偷 ,最后计算的是根节点使用后序遍历
    public int rob(TreeNode root) {
        int[] dp=robTree(root);
        return Math.max(dp[0],dp[1]);
    }
    public int[] robTree(TreeNode node){
        if(node==null){
            return new int[]{0,0};
        }
        
        int[] leftDp=robTree(node.left);
        int[] rightDp=robTree(node.right);
        //偷当前节点  当前节点的值+不偷左右节点的值
        int val0=node.val+leftDp[0]+rightDp[0];
        //不偷当前节点,取left的偷和不偷的最大值 + 取right偷和不偷的最大值
        int vla1=Math.max(leftDp[0],leftDp[1])+Math.max(rightDp[0],rightDp[1]);
        return new int[]{vla1,val0};
    }
}

树形dp状态图 :
image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2039407.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ubuntu虚拟机安装及汉化

一、安装 1.勾选典型(推荐)(T)——点击下一步 2.点击浏览找到光盘映像文件打开&#xff08;此文件很重要安装好后安装包不要卸载&#xff0c;放在不容易被删除的地方&#xff09;——点击下一步 3.将信息补充完整——点击下一步 4.点击浏览选择要将虚拟机安装在哪个路径&…

【IT行业研究报告】Internet Technology

一、引言 随着信息技术的飞速发展&#xff0c;IT行业已成为全球经济的重要驱动力。从云计算、大数据、人工智能到物联网&#xff0c;IT技术正深刻改变着各行各业的生产方式、商业模式和人们的生活方式。本报告旨在深入分析IT行业的现状、发展趋势和挑战&#xff0c;探讨其在各…

基于C11的简单log,支持C++的‘<<’风格和C的‘可变参数’风格

基于C11的简单log&#xff0c;支持C的‘<<’风格和C的‘可变参数’风格 日志仅由richlog.h单个文件实现功能&#xff0c;软件集成简单。 支持C的std::cout的<<风格的日志打印&#xff0c;也支持C的printf风格的日志打印 日志多线程安全&#xff0c;采用C11 mute…

Adobe PhotoShop - 制图操作

1. 排布照片 菜单 - 视图 - 对齐&#xff1a;打开后图层将会根据鼠标的移动智能对齐 菜单 - 视图 - 标尺&#xff1a;打开后在页面出现横纵标尺&#xff0c;方便图层的对齐与排列 2. 自动生成全景照 在日常处理中&#xff0c;我们常常想要将几张图片进行拼接获得一张全景图&…

Linux:文件管理,目录管理,文件系统,链接类型

1&#xff0c;文件管理 用户&#xff08;标识号&#xff1a;UID&#xff09;&#xff1a;一定资源的使用者&#xff0c;可以创建和管理文件以及访问其他用户文件。可以从属于多个群组。 用户组&#xff08;标识号&#xff1a;GID&#xff09;&#xff1a;由一定数量的对某些文件…

GlobalMapper软件安装流程

目录 一、环境准备 二、安装步骤 三、软件激活 一、环境准备 系统&#xff1a;win7操作系统 安装包下载&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1Vb4VVRFBRYawt3MT-5gYOw 提取码&#xff1a;sxdj 二、安装步骤 1、解压&#xff0c;右键global-mapper-23_1-x…

NVDLA专题5:具体模块介绍——Convolution Buffer

概述 卷积缓冲器(CBUF)是卷积流水线中的一个阶段&#xff0c;module定义在NV_NVDLA_cbuf.v&#xff0c;module信息如下&#xff1a; module NV_NVDLA_cbuf (nvdla_core_clk //|< i,nvdla_core_rstn //|< i,cdma2buf_dat_wr_addr //|< i,cdma2buf_dat_wr_…

轻松提升效率:10款工时管理软件推荐

本文将介绍以下10款工具&#xff1a;PingCode、Worktile、百宝云、华为云项目管理、Yonyou NC、云效、红圈通、Asana、7pace Timetracker、Toggl Track。 管理项目工时时&#xff0c;面对繁杂的数据和紧迫的截止日期&#xff0c;很多人都会感到压力倍增。选择一款合适的项目工时…

各大App又要出年度报告啦,看看往年的,谁家能够打动你。

还有几个月就到年终了&#xff0c;各大app都要出年度报告或者年度账单了&#xff0c;咱们先看看往年的效果&#xff0c;你觉得那家好呢&#xff1f;

阿一网络安全实践演练之查找并利用未使用的 API 端点

描述 为了解决实验室问题&#xff0c;利用一个隐藏的 API 端点购买一件 Lightweight l33t 皮夹克。您可以使用以下凭据登录您自己的账户&#xff1a;wiener:peter。 所需知识 要解决这个实验室问题&#xff0c;您需要了解以下内容&#xff1a; 如何利用错误消息构造有效的请…

凡图公益新篇章:凡图家庭教育携手舜和社区,共绘心理健康蓝图

在这个充满挑战与机遇并存的时代&#xff0c;心理健康作为衡量社会文明与进步的重要标尺&#xff0c;正日益受到社会各界的广泛关注。 正是基于这份对美好生活的共同向往与追求&#xff0c;凡图(山东)教育科技集团有限公司与济南市中区舜和社区正式签署了心理援助协议&#xf…

Linux操作系统安装

Linux操作系统安装 Linux操作系统简介VMware 虚拟机简述安装 VMware 虚拟机创建新的虚拟机 安装 Linux 操作系统&#xff08;以 CentOS 为例&#xff09;远程工具连接 Linux查看Linux的ip链接Linux操作步骤 Linux操作系统简介 Linux内核kernel最初是由芬兰人李纳斯托瓦兹&#…

基于计算机爱心小屋公益机构智慧管理(源码+论文+部署讲解等)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台的优…

Alignment

一、前置 1、我们的目的是&#xff1a;给一串声学特征&#xff0c;得出tokens的概率。 2、LAS要计算P(Y|X)&#xff0c;可以直接计算 3、training&#xff0c;就是要找到得到概率结果最大的network的参数 4、CTC、RNN-T要计算P(X|Y)依赖于要知道alignment&#xff08;下图以CT…

模型意识对比学习:摆脱训练中的一致性-容忍度困境

论文出处: ICML2023 Model-Aware Contrastive Learning: Towards Escaping Uniformity-Tolerance Dilemma in Training 什么是uniformity-tolerance困境? 温度参数 τ 的设置会影响模型性能 如果 τ 太小,模型会对训练不足的阶段施加过大的惩罚,导致难以区分潜在阳性样本,…

浙大数据结构慕课课后题(06-图3 六度空间)

题目要求&#xff1a; 输入格式: 输入第1行给出两个正整数&#xff0c;分别表示社交网络图的结点数N&#xff08;1<N≤103&#xff0c;表示人数&#xff09;、边数M&#xff08;≤33N&#xff0c;表示社交关系数&#xff09;。随后的M行对应M条边&#xff0c;每行给出一对正…

简单案例:搞定 SpringBoot 接口恶意刷新和暴力请求

​ 博客主页: 南来_北往 系列专栏&#xff1a;Spring Boot实战 前言 恶意刷新和暴力请求是指攻击者通过大量重复发送请求来对服务器进行攻击的行为。这些请求可能包括频繁刷新页面、提交表单、尝试登录等&#xff0c;旨在消耗服务器资源、导致服务不可用或破坏正常用户的…

WSL 忘记ubuntu的密码

文章目录 1. 以管理员身份打开 PowerShel2.输入命令 wsl.exe -d Ubuntu-20.04 --user root3.输入命令 passwd username 修改用户密码&#xff0c;username即待重置的用户的名称 1. 以管理员身份打开 PowerShel 2.输入命令 wsl.exe -d Ubuntu-20.04 --user root 注意版本号是自…

机械行业数字化生产供应链产品解决方案(一)

在机械行业数字化生产供应链产品解决方案中&#xff0c;通过全面融合物联网技术、数据分析、自动化控制系统和智能供应链管理平台&#xff0c;企业能够实现生产过程的实时监控、智能优化和高效管理&#xff0c;从而显著提升生产效率、降低运营成本&#xff0c;并增强供应链的响…

自动化基础知识

丝杆滑台 滚珠丝干设计时&#xff0c;尽量直线导轨比滚珠丝杆高一点点&#xff0c;安装时在滚珠丝杆处垫调整硅钢片。