一文详解不同路径

news/2024/6/1 18:05:36 标签: leetcode, 算法, java, 动态规划

LeetCode链接

题目描述

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。

问总共有多少条不同的路径?

【题目分析】

  • 我们发现,如果 m = 任意值,n = 1,其实就只有一条路
  • 如果n = 任意值,m= 1其实也只有一条路。
  • 如果m = 3 ,n = 7  他的结果与n = 3 m = 7;是一致的。

我们采用动态规划动态规划三要素

  • dp数组[m][n] 存放到m,n点有dp[m][n]路可以走。
  • dp[m][n]更新算法;这里我们先保留一下。
  • 循环次数与条件,这里我们也保留一下

  • 由上面分析我们可知,m或者n 为任意值 ,另一个值为1时,只有一条路,那么dp数组为

 那么我们思考一下,?的地方应该如何更新呢?

  • 如果我们只看这四个方块时,dp[1][1] 应该是等于 dp[0][1] + dp[1][0];

因此dp的更新公式可以为:dp[i][j] = dp[i-1][j] + dp[i][j-1]

同理其他dp[m][n]可以更新为

  •  最终我们输出dp[m-1][n-1]即可

【代码】

java">package db;

public class UniquePaths {
    public static void main(String[] args) {
        int i = uniquePaths(3, 7);
        System.out.println("i = " + i);
    }

    public static int uniquePaths(int m, int n) {
        int[][] dp = new int[m][n];
        for (int i = 0; i < m; i++) {
            dp[i][0] = 1;
        }
        for (int j = 0; j < n; j++) {
            dp[0][j] = 1;
        }
        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                dp[i][j] = dp[i - 1][j] + dp[i][j-1];
                System.out.print(dp[i][j] + "\t");
            }
            System.out.println();
        }
        return dp[m-1][n-1];
    }

    public static int uniquePaths2(int m, int n) {
        // 是得 n 最长
        if (m > n) {
           m = m^n;
           n = m^n;
           m = m^n;
        }
        int[] arr = new int[n];
        for (int i = 0; i < n; i++) {
            arr[i] = 1;
        }

        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                arr[j] += arr[j-1];
                System.out.print(arr[j] + "\t");
            }
            System.out.println();
        }
        return arr[n-1];
    }
}


http://www.niftyadmin.cn/n/1299392.html

相关文章

linux无法启动 恢复出厂设置密码,RedHat Linux 启动修复及密码恢复

恢复Linux口令并不是一件很难的事情。Linux口令的恢复有2个方面: 一是给用户产生一个新的口令&#xff0c;使用户能够重新登录系统; 二是找出用户原来的口令&#xff0c;而不是以新口令代替旧口令。一般情况下&#xff0c;用户只希望能够再次登录进入系统即可&#xff0c;而不是…

最简单明了的整数拆分解析

LeetCode链接 题目介绍 给定一个正整数 n &#xff0c;将其拆分为 k 个 正整数 的和&#xff08; k > 2 &#xff09;&#xff0c;并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 【题目分析】 这题又是一道动态规划题&#xff0c;且听我详细道来。 首先&am…

linux手机+华为,基于Linux打造,华为重磅宣布,开始在6款手机测试新系统

原标题&#xff1a;基于Linux打造&#xff0c;华为重磅宣布&#xff0c;开始在6款手机测试新系统全球智能手机的发展已经来到了十字路口&#xff0c;技术瓶颈越来越明显。有数据显示&#xff0c;苹果iphone手机的销量依然在下滑&#xff0c;没有很大的起色&#xff0c;这表明消…

黑马点评-Redis主从集群

Redis主从集群 为什么Redis要配置主从集群呢&#xff1f;或者说配置主从集群的优势&#xff1f; 我们知道Redis是用于做缓存的&#xff0c;而且Redis的读次数远远多于写的次数&#xff0c;因此我们配置主从集群的目的在于&#xff0c;主节点进行写操作&#xff0c;从节点用于…

Redis全量同步和增量同步原理

全量同步 主从第一次同步是全量同步&#xff1a;也就是说&#xff0c;当你主从节点连接建立后&#xff0c;需要执行一次全量同步。那么Redis如何实现全量同步呢&#xff1f; 其实本质就是Master 给 slave 发送其保存的RDB文件。slave读取RDB文件恢复数据 详细介绍&#xff1a;…

linux中用if语句查成绩,linux bash中if条件语句结构总结

bash作为一种脚本语言&#xff0c;自然也提供了if语句&#xff0c;思想跟其他语言类似&#xff0c;但语法区别还是很大的。下面是转载的一片文章&#xff0c;介绍的比较详细。Bash conditional statements perform different computations or actions depending on whether a p…

可能是01背包问题最全面的解析

LeetCode链接 01背包问题&#xff1a;在背包大小能装入的前提下&#xff0c;每个商品最多取一个。 首先&#xff0c;我们有背包大小为4。 商品1,商品2&#xff0c;商品3&#xff1b;重量依次为&#xff1a;1,3,4价格依次为&#xff1a;15,20,30&#xff1b;我们首先采用二维…

redhat linux屏幕键盘,资格认证:RedHatLinux9键盘的快捷操作

这里列举了一些你可以用来快速执行常见任务的键盘快捷操作。这些操作不仅限于所列出的内容&#xff0c;要了解更多命令行和键盘的的快捷操作作。[Ctrl] [Alt] [Backspace] 杀死你当前的 X 会话。杀死图形化桌面会话&#xff0c;把你返回到登录屏幕。如果正常退出步骤不起作用…