leetcode62. 不同路径(动态规划-java)

news2024/12/26 7:26:20

不同路径

  • leetcode62. 不同路径
    • 题目描述
    • 暴力递归
      • 代码演示
    • 递归加缓存
      • 代码演示
    • 动态规划
      • 代码演示
  • 动态规划专题

leetcode62. 不同路径

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/unique-paths

题目描述

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?

示例1:
在这里插入图片描述
输入:m = 3, n = 7
输出:28

示例 2:
输入:m = 3, n = 2
输出:3
解释:
从左上角开始,总共有 3 条路径可以到达右下角。

  1. 向右 -> 向下 -> 向下
  2. 向下 -> 向下 -> 向右
  3. 向下 -> 向右 -> 向下

示例 3:
输入:m = 7, n = 3
输出:28

示例 4:
输入:m = 3, n = 3
输出:6

暴力递归

做动态规划的题时,如果无法一眼看出状态转移方程,就先写出暴力递归的尝试,然后改写暴力递归,把暴力递归改写成动态规划的难度,会比直接写动态规划的难度等级降一级.
这题的暴力递归还是比较容易写的,只有向下和向右两个方向做出选择,两个方向不同的情况相加就是总的情况.在写递归时,注意越界情况的处理.
还有一个注意事项,左上角是从(1,1)开始到(m,n)的.

代码演示

	/**
	* 主方法调用
	*/
	 public int uniquePaths(int m, int n) {
	 	//左上角位置是1,1
     	  return process(m,n,1,1);
	 }
	/**
	* 暴力递归
	* i 和 j 来标记来到的位置
	*/
    public int process (int m,int n,int i ,int j){
    	//来到最后一个位置,返回1,前面走的路径有效
        if(i == m && j == n ){
            return 1;
        }
        //越界时,路径选择无效返回0
        if(i > m || j > n){
            return 0;
        }
        //向下走
        int down = process(m,n,i + 1,j);
        //向右走
        int right = process(m,n,i,j + 1);
        //返回两种情况之和
        return down + right;
    }

递归加缓存

j解决递归中的重叠子问题,减少计算,一般情况下,递归加缓存的效率和动态规划的效率是一样的,能写到递归加缓存,就可以了.

代码演示

/**
* 主方法调用
*/
  public int uniquePaths1(int m, int n) {
  	//缓存表
        int[][]dp = new int[m+1][n+1];
       return process2(m,n,1,1,dp);
    }
    /**
    * 加缓存 去除重复计算
    * dp 缓存表
    */
  public int process2 (int m,int n,int i ,int j,int[][]dp){
        if(i == m && j == n ){
            return 1;
        }
        if(i > m || j > n){
            return 0;
        }
        //缓存有值直接从缓存中拿
        if(dp[i][j] != 0){
            return dp[i][j];
        }
        int down = process2(m,n,i + 1,j,dp);
        int right = process2(m,n,i,j + 1,dp);
        //结果存在缓存中
        dp[i][j] = down + right;
        return down + right;
    }

动态规划

这题可以从底向上去推.
从递归中的base case 中可以知道.最右下角是1.我们还可以知道最底下一行,无法向下走,只能向右,所以都是1.最右边一列,无法向右走,只能向下走,所以方法数也是1.
如图演示:
在这里插入图片描述
最后一行和最后一列都是1,再看x 位置如何得出:
根据暴力递归中,.
int down = process2(m,n,i + 1,j,dp);
int right = process2(m,n,i,j + 1,dp);
//结果存在缓存中
dp[i][j] = down + right;
可以看出x 位置依赖两个画三角符合的位置,因此可以得出状态转移方程是:
dp[i][j] = dp[i + 1][j] + dp[i][j + 1];
下面就可以写代码了:

代码演示

/**
* 动态规划
*/
  public int uniquePaths(int m, int n) {
        int[][]dp = new int[m+1][n+1];
		//初始化最后一行
        for (int i = 1; i <= n;i++){
            dp[m][i] = 1;
        }
        //初始化最后一列
        for (int i = 1; i <= m;i++){
            dp[i][n] = 1;
        }
		
        for (int i = m - 1;i >= 0;i--){
            for (int j = n - 1; j >= 0;j-- ){
            //状态转移方程
                dp[i][j] = dp[i + 1][j] + dp[i][j + 1];
            }
        }
        return dp[1][1];
    }

动态规划专题

leetcode877. 石子游戏

leetcode64. 最小路径和

leetcode416. 分割等和子集

leetcode354. 俄罗斯套娃信封问题

leetcode300. 最长递增子序列

leetcode337. 打家劫舍 III

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

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

相关文章

leetcode863. 二叉树中所有距离为 K 的结点(java)

二叉树中所有距离为 K 的结点 leetcode863. 二叉树中所有距离为 K 的结点题目描述 DFS 深度优先遍历代码演示 二叉树专题 leetcode863. 二叉树中所有距离为 K 的结点 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/all-…

英之剑法——第一境(通达人与物之境)

&#x1f31f;博主&#xff1a;命运之光 ☀️专栏&#xff1a;英之剑法&#x1f5e1; ❤️‍&#x1f525;专栏&#xff1a;英之试炼&#x1f525; ☀️博主的其他文章&#xff1a;点击进入博主的主页 &#x1f433; 开篇想说的话&#xff1a;开学就大三了&#xff0c;命运之光…

永磁同步电机在线参数辨识综述

优点 实时性&#xff1a;在线参数辨识能够在电机实际运行时进行参数估计&#xff0c;可以实时地获取电机的参数信息。这使得在线参数辨识更适用于需要实时调节和优化电机控制策略的应用场景。 动态适应性&#xff1a;在线参数辨识可以根据电机的实时工作状态和环境变化来动态地…

最“赚钱”编程语言出炉,惊到我了.....

Stack Overflow 发布了 2023 年开发者调查报告&#xff0c;据称共计超过 9 万名开发者参与了此次调查。 完整报告包含了受访开发者画像&#xff0c;以及关于开发技术、AI、职业、社区等方面的内容。本文主要介绍关于开发技术和 AI 的部分。 懒人目录&#xff1a; 最流行编程语…

[皮尔逊相关系数corrwith]使用案例:电影推荐系统

协同过滤算法用于发现用户与物品之间的相关性&#xff0c;主要有两种&#xff1a;基于用户的和基于物品的。 基于用户&#xff1a; 用户1购买了物品A、B、C、D&#xff0c;并给了好评&#xff1b;而用户2也买了A、B、C&#xff0c;那么认为用户1和用户2是同类型用户&#xff…

hello算法笔记之堆

堆&#xff1a; 一种满足特定条件的完全二叉树&#xff0c;可分为两种类型&#xff1a; 「大顶堆 Max Heap」&#xff0c;任意节点的值 ≥其子节点的值&#xff1b;「小顶堆 Min Heap」&#xff0c;任意节点的值 ≤ 其子节点的值&#xff1b; 将二叉树的根节点称为「堆顶」&a…

p5模型详解

1.研究动机 推荐系统种类繁多&#xff0c;user、item特征集合可以共享&#xff0c;特定架构特定任务使得各任务间无法迁移。 语言可以描述万物&#xff0c;可以作为推荐系统的中间桥梁&#xff0c;受到prompt学习的影响&#xff0c;本文提出了text-to-text框架&#xff0c;称…

【openGauss数据库配置运行参数】--略有小成

【openGauss数据库配置运行参数】--略有小成 &#x1f53b; 一、查看参数值&#x1f530; 1.1 使用SHOW命令查看&#x1f530; 1.2 使用pg_settings视图查看 &#x1f53b; 二、openGauss的六类GUC参数&#x1f53b; 三、重设运行参数&#x1f530; 1.3 重设参数的几种方式&…

5.0、Java_IO流 - IO流类的基本体系结构

5.0、Java_IO流 - IO流类的基本体系结构 Java 为我们提供了多种多样的 IO 流&#xff0c;我们可以根据不同的功能以及性能要求挑选合适的 IO 流&#xff1b; 下图为 Java 中 IO 流类的基本体系结构&#xff08;这里只列举出一些常用的类&#xff0c;详情可以参考 JDK API 文档&…

闭门造轮(LVGL_1)

参考的课程&#xff1a; 全志韦东山的课程&#xff1a;https://www.100ask.net/p/t_pc/course_pc_detail/column/p_61c5a317e4b0cca4a4e8b6f1?product_idp_61c5a317e4b0cca4a4e8b6f1 例程1_// 基础对象(lv_obj)&#xff0c;"Hello, LVGL!" void lvgl_demo(void) …

用平衡因子实现-AVL树

目录 AVL树的概念AVL树节点的定义AVL树的插入AVL树的旋转左单旋(parent->_bf 2 && cur->_bf 1)a,b,c当高度为0a,b,c当高度为1a,b,c当高度为2a,b,c当高度为...... 右单旋(parent->_bf -2 && cur->_bf -1)a,b,c当高度为0a,b,c当高度为1a,b,c当高…

UE5《Electric Dreams》项目PCG技术解析 之 基于关卡PCGSettings的工作流

程序化内容生成框架(Procedural Content Generation Framework,下文简称PCG)可谓是UE5.2版本中最令人瞩目的新技术之一&#xff0c;老王也是在第一时间就关注了这个技术&#xff0c;以前尝试过用Houdini来实现UE5中的程序化内容生成&#xff0c;感觉还是很蹩脚的&#xff0c;毕…

无线发射功率

无线电发射功率 无线电发射机输出的射频信号&#xff0c;通过馈线&#xff08;电缆&#xff09;输送到天线&#xff0c;由天线以电磁波形式辐射出去。电磁波到达接收地点后&#xff0c;由天线接收下来&#xff08;仅仅接收很小很小一部分功率&#xff09;&#xff0c;并通过馈…

Linux系统编程(再论execve)

文章目录 前言一、execve的第三个参数二、进程空间三、命令行参数规范四、optstring规则的扩展定义总结 前言 本篇文章我们继续来研究一下execve这个系统调用&#xff0c;上篇文章已经讲解了前两个参数的意义了&#xff0c;那么这篇文章就来讲解一下第三个参数的具体含义。 一…

三分钟学习一个python小知识4-----------我的对python中numpy的理解, 我列举了关于numpy常用的10个例子来深入理解numpy

这里写目录标题 1、NumPy是什么2、NumPy的常见应用---必须掌握2.1.创建一个数组2.2.数组的属性2.3.取数组中的元素2.4.数组的运算2.5.数组的转置2.6. 数组的索引和切片2.7. 数组的重塑2.8. 数组的广播2.9. 数组的聚合操作2.10. 数组的排序 总结 1、NumPy是什么 NumPy是专门用于…

vue+elementui实现app布局小米商城,样式美观大方,功能完整

目录 一、项目效果在线预览 二、效果图 1.首页效果图 2.分类&#xff0c;动态分类商品数据根据所属分类动态切换 3.购物车&#xff0c;动态添加购物车&#xff08;增、删、改、查&#xff09; 4.我的 5.登录注册 6.商品详情 7.搜索&#xff08;动态模糊搜索、搜索历史…

12---整数转罗马数字

罗马数字包含以下七种字符&#xff1a; I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例…

文件上传漏洞-用骗子的角度分析

&#xff08;一&#xff09;文件上传漏洞 文件上传漏洞&#xff0c;发送在用户上传文件功能中&#xff0c;很多网址都对上传的文件格式进行限制&#xff0c;但是被攻击机者找到漏洞&#xff0c;把木马、病毒进行上传&#xff0c;然后控制服务器。对上传的文件格式不是不限制&a…

MySQL实战解析底层---为什么这些SQL语句逻辑相同,性能却差异巨大

目录 前言 案例一&#xff1a;条件字段函数操作 案例二&#xff1a;隐式类型转换 案例三&#xff1a;隐式字符编码转换 前言 在MySQL中&#xff0c;有很多看上去逻辑相同&#xff0c;但性能却差异巨大的SQL语句对这些语句使用不当的话&#xff0c;就会不经意间导致整个数据…

动态规划V (85、91、97)-最近都开始摆烂

CP85 最大矩形 题目描述&#xff1a; 给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵&#xff0c;找出只包含 1 的最大矩形&#xff0c;并返回其面积。 学习记录&#xff1a; 对每一个地方都去统计最大举行的话&#xff0c;会有很多多余的计算&#xff0c;题…