【Leetcode】十八、动态规划:不同路径 + 最大正方形

文章目录

  • 1、动态规划
  • 2、leetcode509:斐波那契数列
  • 3、leetcode62:不同路径
  • 4、leetcode121:买卖股票的最佳时机
  • 5、leetcode70:爬楼梯
  • 6、leetcode279:完全平方数
  • 7、leetcode221:最大正方形

1、动态规划

只能向下、向右的走,从图中左上角走到右下角,有几条路径
在这里插入图片描述因为只能向下、向右走,所以从起始点走到点(R,C),路径数等于,以起始点到点(R,C)为对角线的矩形里,到点(R,C)左侧点的路径数 + 到点(R,C)上边点的路径数 (动态规划的方程式)

// 动态规划的方程式
[RC] = [R - 1][C] + [R][C - 1]

在这里插入图片描述

有些类似斐波那契数列了,起始点就是[0][0] (动态规划的初始状态),那递归终止的条件,就是其左侧点或者上边点不存在,此时,到它的路径只有一条,return 1,一直算到点(R,C)(动态规划的终止状态)。以上,动态规划的三要素:

  • 动态规划的方程式
  • 动态规划的初始状态
  • 动态规划的终止状态

从起始状态(0,0),到终止状态(R,C),中间每个格子的值(到达它的路径数),都会算出来,这些中间结果,可存入一个数组,这题可用二维数组存。动态规划可用来干:

  • 1)计数:有多少种方式或路径,如上面从左上角到右下角有多少路径
  • 2)求最值:从左上角到右下角路径的最大数字和,每个数字不等,代表权重,求最长路径或最小路径
  • 3)求存在性:是否存在某个可能,可以从A走到B

动态规划的分类:

  • 自底向上:从最小的子问题开始,逐步计算出所有可能的状态,直到解决原问题

  • 自顶向下:通过递归地方式,从原问题开始,依次分解为更小的子问题,通常需要记忆化搜索(Memoization)来保存已经计算过的结果,避免重复计算

在这里插入图片描述

2、leetcode509:斐波那契数列

在这里插入图片描述

不再递归了,根据方程式,步步为营,从F(2)一路计算到F(n),并把每个中间值存入数组中,最后返回数组的第n个元素即可

public class P509Two {public int recursion(int n) {//F(0)和F(1)if (n < 2) {return n == 0 ? 0 : 1;}int[] dp = new int[n + 1];dp[1] = 1;  //F(1)// 根据方程式,计算每个值,存入数组,从F(2)一路计算到F(5)for (int i = 2; i <= n; i++) {dp[i] = dp[i - 1] + dp[i - 2];}return dp[n];}
}

3、leetcode62:不同路径

在这里插入图片描述

前面已经分析过了,这儿的方程式为:F(m,n)= F(m - 1,n)+ F(m,n - 1),初始状态为(1,1),终止状态为(m,n)


public class P62 {public int uniquePaths(int m, int n) {int[][] dp = new int[m][n];dp[0][0] = 1;for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {// 如果是边缘,x轴或者y轴,则直接赋值1,因为只有一条路可达,其余按方程式赋值if (i == 0 || j == 0) {dp[i][j] = 1;} else {dp[i][j] = dp[i - 1][j] + dp[i][j - 1];}}}return dp[m - 1][n - 1];}
}

红圈里的这些,x轴或者y轴上的,到达他们的路径只有一条,因此直接赋值1,别用方程式去计算,会导致数组下标越界。除了这些点,其余按方程式赋值,最后返回(m-1,n-1)位置的值即可。
在这里插入图片描述

两道题,给我的个人感觉是,动态规划,就是从初始状态开始,根据方程式,步步为营,经过一个个中间状态的值,到达终止状态 ,最后,如果你需要存储这些中间状态值,一般用数组存储,因为其访问数据的时间复杂度为O(1)。

4、leetcode121:买卖股票的最佳时机

在这里插入图片描述

这题,本质就是求数组后面元素与前面元素的差值的最大值,两层for循环,默认返回为0,遇到最大的值就覆盖,即可:


优化下:遍历数组,更新前 i 天的最低买入成本,同时更新前i天的最高利润(第i天与前面i-1天最低价的差值,然后不停覆盖这个差值,取最大值)

在这里插入图片描述


5、leetcode70:爬楼梯

在这里插入图片描述
参考上面62题不同路径的思想:

  • 62题:到(m,n)的路径数 = 到(m,n)上方点的路径数 + 到(m,n)左侧点的路径数,因为规定了只能向下、向右移动
  • 本题:到n阶的路径数 = 到n - 1阶的路径数 + 到 n - 2阶的路径数,因为一次只能走一个或者两个台阶

切入点:动态规划要经过状态转移,那就该想一下,题中要求的状态,怎么可以由上一步到达

由此,动态规划方程式为:

f(n) = f(n - 1) + f(n - 2)

代码实现:


6、leetcode279:完全平方数

在这里插入图片描述
思路一:暴力解法

在这里插入图片描述

根据四平方和定理,这题返回的结果肯定是1、2、3、4里的一个。那我找:n是否能由1个平方数搞出来,不行就看是否能由2个平方数搞出来,最多到4,封顶了就。因为这题求的是最少的数量,别说n = 1 + 1 + 1 + …… + 1。借助以下四条数学规律:
在这里插入图片描述

实现:

在这里插入图片描述

7、leetcode221:最大正方形

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

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

相关文章

C#开源、简单易用的Dapper扩展类库 - Dommel

项目特性 Dommel 使用 IDbConnection 接口上的扩展方法为 CRUD 操作提供了便捷的 API。 Dommel 能够根据你的 POCO 实体自动生成相应的 SQL 查询语句。这大大减少了手动编写 SQL 代码的工作量&#xff0c;并提高了代码的可读性和可维护性。 Dommel 支持 LINQ 表达式&#xff…

记一次因敏感信息泄露而导致的越权+存储型XSS

1、寻找测试目标 可能各位师傅会有苦于不知道如何寻找测试目标的烦恼&#xff0c;这里我惯用的就是寻找可进站的思路。这个思路分为两种&#xff0c;一是弱口令进站测试&#xff0c;二是可注册进站测试。依照这个思路&#xff0c;我依旧是用鹰图进行了一波资产的搜集&#xff…

SSIS_SQLITE

1.安装 SQLite ODBC 驱动程序 2.添加SQLite数据源 在“用户DSN”或“系统DSN”选项卡中&#xff0c;点击“添加”。选择“SQLite3 ODBC Driver”&#xff0c;然后点击“完成”。在弹出的配置窗口中&#xff0c;设置数据源名称&#xff08;DSN&#xff09;&#xff0c;并指定S…

英迈中国与 Splashtop 正式达成战略合作协议

2024年7月23日&#xff0c;英迈中国与 Splashtop 正式达成战略合作协议&#xff0c;英迈中国正式成为其在中国区的战略合作伙伴。此次合作将结合 Splashtop 先进的远程桌面控制技术和英迈在技术服务与供应链管理领域的专业优势&#xff0c;为中国地区的用户带来更加安全的远程访…

联想教育电脑硬盘保护同传EDU系统使用简明教程

目录 一、原理概述 二、简明使用方法 1、软件下载 2、开机引导 3、开始安装 4、使用 &#xff08;1&#xff09;进入底层 &#xff08;2&#xff09;进行分区设置 &#xff08;3&#xff09;系统设置 &#xff08;4&#xff09;安装硬盘保护驱动 &#xff08;5&…

前端模块化CommonJS、AMD、CMD、ES6

在前端开发中&#xff0c;模块化是一种重要的代码组织方式&#xff0c;它有助于将复杂的代码拆分成可管理的小块&#xff0c;提高代码的可维护性和可重用性。CommonJS、AMD&#xff08;异步模块定义&#xff09;和CMD&#xff08;通用模块定义&#xff09;是三种不同的模块规范…

leetcode-101. 对称二叉树

题目描述 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1a;false 思路 1) 如果同时root1…

【调试笔记-20240723-Linux-gitee 仓库同步 github 仓库,并保持所有访问链接调整为指向 gitee 仓库的 URL】

调试笔记-系列文章目录 调试笔记-20240723-Linux-gitee 仓库同步 github 仓库&#xff0c;并保持所有访问链接调整为指向 gitee 仓库的 URL 文章目录 调试笔记-系列文章目录调试笔记-20240723-Linux-gitee 仓库同步 github 仓库&#xff0c;并保持所有访问链接调整为指向 gite…

Ubuntu20.04版本升级openssh9.8p1方法

一、问题描述&#xff1a; 8.5p1 和 9.7p1 之间的openssh版本漏洞可能会导致linux系统以root身份进行RCE&#xff0c;所以需安装最新版本 二、解决方法&#xff1a; 将当前openssh版本升级到最新的版本即openssh-9.8p1版本&#xff0c;OpenSSL大版本升级且OpenSSH有新稳定版本…

Zabbix监控应用

一.监控tomcat 1.在tomcat服务器上安装zabbix-agent服务 [rootnode2 etc]#vim zabbix_agentd.conf 94 Server192.168.240.13 #指向当前zabbix server ##### Passive checks related #被动检查相关配置### Option: ListenPort ListenPort10050 #监听端口 默认的无需修改11…

SPF配置教程:如何安全构建邮件发送策略?

SPF配置教程的步骤详解&#xff01;SPF记录配置方法策略有哪些&#xff1f; SPF通过允许域名所有者指定哪些主机可以代表该域发送邮件&#xff0c;从而减少电子邮件欺诈和垃圾邮件的风险。AokSend将详细介绍SPF配置教程&#xff0c;并指导您如何安全地构建邮件发送策略。 SPF…

《白话机器学习的数学》第4章——评估

4.1模型评估 1.由于像多重回归这样的问题会导致无法在图上展示&#xff0c;所以需要能够够定量地表示机器学习模型的精度。 4.2交叉验证 4.2.1回归问题的验证 1.把获取的全部训练数据分成两份&#xff1a;一份用于测试&#xff0c;一份用于训练。然后用前者来评估模型。 一般…

C# 数组常用遍历方式

// 假设数组Point[] points new Point[2];// 第一种遍历 forfor (int i 0; i < points.Length; i){Point p points[i];Console.WriteLine($"X{p.X},y{p.Y}");}// 第二种遍历 foreachforeach (Point p in points){Console.WriteLine($"X{p.X},y{p.Y}"…

TCP三次握手和四次挥手的理解

三次握手 第一次握手&#xff1a; 客户端发出 请求报文其中SYN应1&#xff0c;选择一个序列号x 第二次握手&#xff1a; 服务端接收到之后回复 确认报文&#xff0c;其中SYN应1&#xff0c;ACK1&#xff0c;确认号是x1&#xff0c;同时为自己初始化序列号y 第三次握手&…

Hadoop架构

一、案列分析 1.1案例概述 现在已经进入了大数据(Big Data)时代&#xff0c;数以万计用户的互联网服务时时刻刻都在产生大量的交互&#xff0c;要处理的数据量实在是太大了&#xff0c;以传统的数据库技术等其他手段根本无法应对数据处理的实时性、有效性的需求。HDFS顺应时代…

Linux(CentOS)的“应用商城” —— yum

Linux&#xff08;CentOS&#xff09;的“应用商城” —— yum 关于 yum 和软件包Linux 系统&#xff08;CentOS&#xff09;的生态yum 相关操作yum 本地配置yum 安装 lrzsz.x86_64 关于 yum 和软件包 首先 yum 是软件下载安装管理的客户端&#xff0c;类似各种手机里的“应用…

WEB前端10- Fetch API(同步/异步/跨域处理)

Fetch API Fetch API 可以用来获取远程数据&#xff0c;用于在 Web 应用程序中发起和处理 HTTP 请求。它基于 Promise&#xff0c;提供了一种简单而强大的方式来处理网络通信&#xff0c;替代了传统的 XMLHttpRequest。 Promise对象 Promise 对象是 JavaScript 中处理异步操…

0723,UDP通信(聪明小辉聪明小辉),HTTP协议

我就是一个爱屋及乌的人&#xff01;&#xff01;&#xff01;&#xff01; #include "network_disk_kai.h" 昨天的epoll&#xff1a; 可恶抄错代码了 epoll_s.csockect return listenfdsetsockoptsockaddr_in bind listenfd & serveraddr…

Ubuntu 中默认的 root 用户密码

场景&#xff1a;想要切换root用户&#xff0c;发现得输入密码&#xff0c;以为是以前设置过然后一直尝试都是错误【认证失败】最后发现根本没设置过root用户&#xff0c;默认会随机生成root用户的密码&#x1f605; Ubuntu 中默认的 root 密码是随机的&#xff0c;即每次开机都…

用51单片机或者stm32能否开发机器人呢?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「单片机的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;能的。但是由于单片机和st…