动态规划入门,从简单递归到记忆化搜索到动态规划

news2024/10/6 3:12:48

动态规划入门,从简单递归到记忆化搜索到动态规划

打家劫舍

在这里插入图片描述

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

思路:

首先看到题目可以转换到当前这个位置选择或者不选的场景,比如说,首先我们选择了第一个,那么下一次能选择的第一个是第三个,如果不选第一个的话,下一个能选择的就是第二个.

注意点

  1. 对于结束的地方,刚开始大家可能会想着这个时候会是结束的地方,需要返回中的sum结果,但是我们需要知道这个地方返回的是当前位置能有的收益是多少,如果当前这个位置已经 < 0,那么这时候结果就是0。
  2. int res = Math.max(dfs(i - 1), dfs(i - 2) + nums[i]); 这代表我们在当前i的这个位置能有的两种情况,对于第一种情况,表示在当前这个位置我们不进行选择,可以在下一个位置进行选择。第二种情况表示我们选择了当前这个位置,体现在将当前的收益进行相加,下一次能选择的第一个位置就是dfs(i - 2),最后选择这两种情况的最大值。
  3. 返回res的结果。

上述情况会超时,我们分析一下是哪些时候会重复计算:

在这里插入图片描述
上述情况中,可以看到2的这种情况会重复计算,我们可以在计算得到2的结果之后,将2的结果保存到map中或者数组中,这样下次需要2的结果的时候直接从map中进行查找就可以,这时候O(1)的时间就可以获得。

记忆化搜索

class Solution {
    private int nums[];
    HashMap<Integer,Integer> hashmap = new HashMap<>(); // 记忆化数组
    public int rob(int[] nums) {
        this.nums = nums;
        return dfs(nums.length - 1);
    }
    public int dfs(int i){
        if (i < 0){
            return 0;
        }
        if (hashmap.containsKey(i)){ // 如果当前这个位置之前已经算过,直接去记忆化数组中拿
            return hashmap.get(i);
        }
        int res = Math.max(dfs(i - 1), dfs(i - 2) + nums[i]);
        hashmap.put(i,res); // 每次计算一个结果 就将当前的结果存入到记忆化数组中
        return res;
    }
}

和上面的代码优化的地方就是加入了一个记忆化数组,如果一个位置的结果计算过,就将结果存入到记忆化数组中,之后需要这个结果的时候,就从记忆化数组中进行获取。

从记忆化搜索到动态规划

我们使用图示的方法:

步骤

1、首先查看dfs中有多少个可变的变量(有时候,有些参数是固定的,不会发生变化)。比如说这里我们只有一个参数,我们就生成一个一维表。
2、找到已知条件。动态规划的题目都是可以从一些给定的点,逐步得到最后的结果,比如说给定0,我们可以推到1,得到1,可以推出2,得到2,可以推出 3,之后逐步获得答案。那么我们需要如何得到这些已知条件。
答案就是我们可以看basecase,也就是dfs递归的出口,我们观察到当i < 0 的时候,对应的结果都是0。另外我们观察到我们需要两个参数,所以我们取出 -1 和 -2 得到 dfs(0)
dfs(0)= max(dfs(-1),dfs(-2) + nums[0])= 1
dfs(1)= max(dfs(0),dfs(-1) + nums[1]
。。。。。
依次可以得到最终的dfs(4),这个dfs(4)就是我们需要的最终结果。

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

超过100%

我们声明可一个结果数组,这个结果数组是一维的,正如我们上面讨论的一样,可变参数有几个,就声明一个几维的数组,初始的时候将数组的第一个和第二个设置成0,之后依次填充数组,返回最后一个结果。

希望对看到这里的你有一点点帮助!

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

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

相关文章

Python学习篇:Python基础知识(三)

目录 1 Python保留字 2 注释 3 行与缩进 ​编辑4 多行语句 5 输入和输出 6 变量 7 数据类型 8 类型转换 9 表达式 10 运算符 1 Python保留字 Python保留字&#xff08;也称为关键字&#xff09;是Python编程语言中预定义的、具有特殊含义的标识符。这些保留字不能用作…

【UML用户指南】-28-对体系结构建模-部署

目录 1、名称 2、节点与制品 2.1、结点与制品相同&#xff1a; 2.2、不同 3、组织结点 4、连接 5、常用建模技术 5.1、对处理器和设备建模 5.2、对制品的分布建模 正如制品一样&#xff0c;结点存在于物质世界中&#xff0c;在对系统的物理方面建模中它是一个重要构造…

Python——面向对象编程(类和对象)2

目录 私有属性和私有方法 01.应用场景及定义方式 02.伪私有属性和私有方法 继承 1.1继承的概念、语法和特点 1.继承的语法&#xff1a; 2.专业术语&#xff1a; 3.继承的传递性 1.2方法的重写 1.覆盖父类的方法 2.对父类方法进行扩展 关于super 1.3 父类的私有属性和…

数据看板/可视化大屏的实际价值到底是什么?详解数据可视化的实用之处

数据驾驶舱/数据看板/可视化大屏的实际价值&#xff0c;取决于使用者的实际需求。 华而不实&#xff1f;华就是实&#xff01; 关于可视化大屏最广泛的争议&#xff0c;便是对其“华而不实”的批评&#xff0c;认为可视化大屏缺乏技术含量&#xff0c;只是一钟比较高级的“装饰…

WRF学习——使用CMIP6数据驱动WRF/基于ncl与vdo的CMIP6数据处理

动力降尺度 国际耦合模式比较计划&#xff08;CMIP&#xff09;为研究不同情景下的气候变化提供了大量的模拟数据&#xff0c;而在实际研究中&#xff0c;全球气候模式输出的数据空间分辨率往往较低&#xff08;>100Km&#xff0c;缺乏区域气候特征&#xff0c;为了更好地研…

析构函数和拷贝构造函数

文章目录 析构函数1.析构函数的定义&#xff1a;2.析构函数的语法&#xff1a;3.析构函数的特性&#xff1a; 拷贝构造函数1.拷贝构造函数的定义&#xff1a;2.拷贝构造函数的语法3.拷贝构造函数的特性(1)拷贝构造函数是构造函数的一个重载形式**(这个其实也很好理解&#xff0…

鸿蒙小案例-首选项工具类

一个简单的首选项工具类 主要提供方法 初始化 init()方法建议在EntryAbility-》onWindowStageCreate 方法中使用 没多少东西&#xff0c;放一下测试代码 import { PrefUtil } from ./PrefUtil; import { promptAction } from kit.ArkUI;Entry Component struct PrefIndex {St…

关于软件本地化,您应该了解什么?

软件本地化是调整软件应用程序以满足目标市场的语言、文化和技术要求的过程。它不仅仅涉及翻译用户界面&#xff1b;它包含一系列活动&#xff0c;以确保软件在目标语言环境中可用且相关。以下是您应该了解的有关软件本地化的一些关键方面&#xff1a; 了解范围 软件本地化是…

学生用小台灯什么牌子的好?列举出几款学生用台灯推荐

眼睛是我们感知世界的窗口&#xff0c;但近年来&#xff0c;儿童青少年的视力健康却受到了严重困扰。数据显示&#xff0c;近视问题在儿童群体中呈现出明显的增长趋势&#xff0c;这给他们的学习和生活带来了诸多不便。虽然现代科技的快速发展使得电子产品成为了我们生活中不可…

UE5.4新功能 - Texture Graph上手简介

TextureGraph是UE5.4还在实验(Experimental)阶段的新功能&#xff0c;该功能旨在材质生成方面达到类似Subtance Designer的效果&#xff0c;从而程序化的生成一些纹理。 本文就来简要学习一下。 1.使用UE5.4或以上版本&#xff0c;激活TextureGraph插件 2.内容视图中右键找到…

React@16.x(47)路由v5.x(12)源码(4)- 实现 Route

目录 1&#xff0c;原生 Route 的渲染内容2&#xff0c;实现 1&#xff0c;原生 Route 的渲染内容 对如下代码来说&#xff1a; import { BrowserRouter as Router, Route } from "react-router-dom"; function News() {return <div>News</div>; }func…

【前端】IntersectionObserver 实现图片懒加载和无限滚动

【前端】IntersectionObserver 实现图片懒加载和无限滚动 在前端开发中&#xff0c;性能优化是一个重要的考量因素。随着现代网页和应用的复杂性增加&#xff0c;确保页面快速加载和流畅运行变得越来越重要。本文将介绍一种强大的工具——IntersectionObserver API&#xff0c…

【Linux进阶】文件和目录的默认权限与隐藏权限

1.文件默认权限&#xff1a;umask OK&#xff0c;那么现在我们知道如何建立或是改变一个目录或文件的属性了&#xff0c;不过&#xff0c;你知道当你建立一个新的文件或目录时&#xff0c;它的默认权限会是什么吗&#xff1f; 呵呵&#xff0c;那就与umask这个玩意儿有关了&…

HTTP与HTTPS协议区别及应用场景

HTTP&#xff08;超文本传输​​协议&#xff09;和 HTTPS&#xff08;安全超文本传输​​协议&#xff09;都是用于通过网络传输数据的协议。虽然它们有一些相似之处&#xff0c;但在安全性和数据保护方面也存在显著差异。 在这篇博文中&#xff0c;我们将探讨 HTTP 和 HTTPS…

基于antv x6实现的组织架构图

X6 是基于 HTML 和 SVG 的图编辑引擎&#xff0c;基于 MVC 架构&#xff0c;用户更加专注于数据逻辑和业务逻辑。 一、业务背景 将组织树形结构图形化&#xff0c;更直观的展示个人所在的组织架构。 二、功能点 组织结构按需渲染&#xff0c;支持层级展开、收缩按需求自定义…

MySQL表的练习

二、创建表 1、创建一个名称为db_system的数据库 create database db_system; 2、在该数据库下创建两张表&#xff0c;具体要求如下 员工表 user 字段 类型 约束 备注 id 整形 主键&#xff0c;自增长 id N…

机器人控制系列教程之Stewart平台简介和运动学分析

Stewart平台简介及应用场景 六自由度 Stewart 并联机器人结构简图如下图所示&#xff0c;主要有一个固定平台和一个移动平台以及六个可伸缩的推杆组成&#xff0c;通常情况下&#xff0c;固定平台与底座连接&#xff0c;移动平台在空间具有六个自由度&#xff0c;通过六个推杆…

Webpack: 基于Sourcemap源码映射原理与使用技巧

概述 Sourcemap 协议 最初由 Google 设计并率先在 Closure Inspector 实现&#xff0c;它的主要作用就是将经过压缩、混淆、合并的产物代码还原回未打包的原始形态&#xff0c;帮助开发者在生产环境中精确定位问题发生的行列位置&#xff0c;例如&#xff1a; 在 Webpack 内…

【话题】IT专业入门,高考假期预习指南

IT专业入门&#xff0c;高考假期预习指南 亲爱的高考学子们&#xff0c; 七月的阳光&#xff0c;如同你们的梦想&#xff0c;炽热而明亮。当你们手中的笔落下最后一道题的答案&#xff0c;那不仅仅是对过去十二年寒窗苦读的告别&#xff0c;更是对未知世界探索的启程号角。你们…

为了SourceInsight从Linux回到Windows

什么是SourceInsight 现在上网搜索这个软件&#xff0c;大多数说他是一个代码阅读软件&#xff1b;但是在官方的说法里面&#xff0c;这是一款支持多语言的编辑器。大概长这样&#xff1a; 看起来十分老旧是吧&#xff0c;但是他其实他已经是第四代了哈哈哈。其实这个软件是我…