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

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

打家劫舍

在这里插入图片描述

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.mzph.cn/diannao/40855.shtml

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

相关文章

127还是localhost....?

前几天刚发现了一跨域问题&#xff0c;本来吧跨域问题也挺好解决的。 网上搜点教程&#xff0c;该怎么配置就怎么配置就完事了。 但是今天这个跨域问题有点棘手&#xff0c;问题就出在127.0.0.1还是localhost上面 先放一下一开始在127.0.0.1解决跨域的代码 前端 HTML <…

Vim脚本编写:自动化任务与自定义命令

Vim脚本&#xff08;Vim Script&#xff09;是一种强大的工具&#xff0c;用于扩展和自动化Vim编辑器的功能。通过编写Vim脚本&#xff0c;你可以创建自定义命令、自动化常见任务、增强编辑器功能&#xff0c;以及提高你的工作效率。本文将介绍Vim脚本编写的基础知识和一些实用…

预制菜工厂MES系统:具体功能与应用场景

在现代化食品工业中&#xff0c;预制菜&#xff08;Ready-to-Eat, RTE&#xff09;因其方便快捷、卫生安全及营养均衡的特点&#xff0c;迅速在餐饮行业中占据重要地位。为了进一步提升预制菜工厂的生产效率、保障产品质量并降低生产成本&#xff0c;制造执行系统&#xff08;M…

代码随想录训练营第二十八天 122买卖股票的最佳时间II 55跳跃游戏 45跳跃游戏II 1005K次取反后最大化的数组和

第一题&#xff1a; 原题链接&#xff1a;122. 买卖股票的最佳时机 II - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 这题十分简单&#xff0c;就是把相邻天数的金额相减&#xff0c;如果发现大于0就加到res中&#xff0c;返回res即可 代码如下&#xff1a; …

error: ‘CV_FONT_HERSHEY_SIMPLEX’ was not declared in this scope 的参考解决方法

文章目录 写在前面一、问题描述二、解决方法参考链接 写在前面 自己的测试环境&#xff1a; Ubuntu20.04&#xff0c;OpenCV 4.2.0 一、问题描述 编译 OpenCV 的程序时&#xff0c;出现如下报错 error: ‘CV_FONT_HERSHEY_SIMPLEX’ was not declared in this scope二、解决…

MySQL中的可插拔身份验证(Pluggable Authentication)(二)

Pluggable Authentication&#xff08;PAM&#xff0c;即可插拔式认证模块&#xff09;是一种高效且灵活的用户级别的认证方式&#xff0c;广泛应用于现代操作系统&#xff0c;特别是Linux服务器中。它允许数据库管理员&#xff08;DBAs&#xff09;为MySQL用户帐户选择和更改不…

ffmpeg将多个yuv文件编码为MP4视频文件

一、编码方案 在视频录制时&#xff0c;每一帧保存为一个yuv文件&#xff0c;便于纠错和修改。在编码为MP4文件时&#xff0c;我的方案是将所有yuv文件先转码为单个MP4文件&#xff0c;然后使用ffmpeg的concat功能拼接为完整的视频。 二、shell脚本 #!/bin/bash# 检查参数数量…

MYSQL8.0环境部署

创建用户 groupadd mysql useradd -g mysql mysql 删除原来的包 # rpm -qa|grep mysql # rpm -qa|grep mari mariadb-libs-5.5.68-1.el7.x86_64 # rpm -e --nodeps mariadb-libs-5.5.68-1.el7.x86_64 解压 cd /usr/local & mkdir mysql cd mysql # cp mysql-8…

Ubuntu 22.04 安装中文字体

笔者在用OpenCV4.9处理图片加水印时&#xff0c;中文乱码。原来是Ubuntu 22.04发行版缺少中文字体支持&#xff0c;因此&#xff0c;笔者就找资料安装了需要的中文字体&#xff0c;特此记录&#xff0c;以备后查。 1、打开终端&#xff1a; 2、更新软件包列表&#xff1a; su…

【LC刷题】DAY22:491 46 47 332 51 37

【LC刷题】DAY22&#xff1a;491 46 47 332 51 37 文章目录 【LC刷题】DAY22&#xff1a;491 46 47 332 51 37491. 非递减子序列 [link](https://leetcode.cn/problems/non-decreasing-subsequences/description/)46. 全排列 [link](https://leetcode.cn/problems/permutations…

水利行业的智慧化转型实践:结合具体案例,探讨智慧水利在提升水资源利用效率、改善水生态环境方面的实际效果

目录 一、引言 二、智慧水利的定义与意义 三、智慧水利在提升水资源利用效率方面的实践 1. 智慧灌溉系统 2. 智慧供水系统 3. 智慧水务管理平台 四、智慧水利在改善水生态环境方面的实践 1. 智慧水质监测系统 2. 智慧水生态修复系统 3. 智慧防洪减灾系统 五、具体案例…

如何在 Odoo 16 中添加计算字段的搜索过滤器

首先&#xff0c;了解 Odoo 使用计算字段的原因很重要。当我们需要从其他字段获取计算值或计算值时&#xff0c;就会使用计算字段。换句话说&#xff0c;不是从数据库中检索值&#xff0c;而是可以使用函数计算字段的值。计算字段的一个例子是产品总金额&#xff0c;即通过将产…

EtherCAT通讯介绍

一、EtherCAT简介 EtherCAT&#xff08;Ethernet for Control Automation Technology&#xff09;是一种实时以太网技术&#xff0c;是由德国公司Beckhoff Automation在2003年首次推出的。它是一种开放的工业以太网标准&#xff0c;被设计用于满足工业自动化应用中的高性能和低…

汇聚荣拼多多评价好不好?

汇聚荣拼多多评价好不好?在探讨电商平台的口碑时&#xff0c;用户评价是衡量其服务质量和商品质量的重要指标。拼多多作为国内领先的电商平台之一&#xff0c;其用户评价自然成为消费者选择购物平台时的参考依据。针对“汇聚荣拼多多评价好不好?”这一问题&#xff0c;可以从…

Vue3 Hooks 用法 scrollTop, mousemoveHandler,useCountDown

三个实例来自 learn_vue: 【教学工程】学习vue2/vue3 (gitee.com) 目录 1. 何为Hooks 2. 使用场景 3. 常见的 Hooks 函数 4. 实例 4.1简易hook 例子 4.2 自定义scrolltop例子 4.3 mousemoveHandler例子 4.4 useCountDown例子 1. 何为Hooks Hooks 是一种函数&#xff0c;用于…

vue css 链式布局模式

<div class"pp-wrap"> <div class"pp-left"><!--跳活动反思--><div class"even-box" v-for"(item,index) in trackingPtoPLeftList" :key"index" click"jumpReview(item)"><div …

echarts柱状选中shadow阴影背景宽度设置

使用line&#xff0c;宽度增大到所需要的宽度&#xff0c;设置下颜色透明度就行 tooltip: {trigger: axis,//把阴影的层级往下降z:-15,axisPointer: {type: line,lineStyle: {color: rgba(150,150,150,0.3),width: 44,type: solid,},}, }, series: [{type: bar,barWidth:20,//…

python自动化办公之BeautifulSoup爬取并解析html文本

用到的库&#xff1a;BeautifulSoup 实现效果&#xff1a;爬取网站内容&#xff0c;拿到html文本并解析html文本 代码&#xff1a; 先爬取 # 先导入requests包 import requests urlhttps://www.baidu.com responserequests.get(url) # 做1个断言&#xff0c;如果执行成功&a…

【C语言】—— 文件操作(上)

【C语言】—— 文件操作&#xff08;上&#xff09; 一、 为什么使用文件二、 什么是文件2.1、 程序文件2.2、 数据文件2.3、 文件名2.4、二进制文件与文本文件 三、 文件的打开和关闭3.1、流和标准流&#xff08;1&#xff09;流&#xff08;2&#xff09;标准流 3.2、文件指针…

64.函数参数和指针变量

目录 一.函数参数 二.函数参数和指针变量 三.视频教程 一.函数参数 函数定义格式&#xff1a; 类型名 函数名(函数参数1,函数参数2...) {代码段 } 如&#xff1a; int sum(int x&#xff0c;int y) {return xy; } 函数参数的类型可以是普通类型&#xff0c;也可以是指针类…