当前位置: 首页 > news >正文

不同路径——1

一个机器人位于一个 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

解题思路·:

由于机器人只能向下或向右移动,要到达网格中的某个特定位置 (i, j),它只能从该位置的上方 (i - 1, j) 或者左方 (i, j - 1) 移动过来。这就意味着到达位置 (i, j) 的不同路径数量与到达其上方和左方位置的不同路径数量有关,设 dp[i][j] 表示机器人从网格的左上角 (0, 0) 移动到位置 (i, j) 的不同路径数量。这里 i 表示行索引,范围是 0 到 m - 1j 表示列索引,范围是 0 到 n - 1。对于第一行的任意位置 (0, j)j 从 0 到 n - 1),因为机器人只能从左上角一直向右移动才能到达这些位置,所以到达这些位置的路径只有一种,即 dp[0][j] = 1。对于第一列的任意位置 (i, 0)i 从 0 到 m - 1),因为机器人只能从左上角一直向下移动才能到达这些位置,所以到达这些位置的路径也只有一种,即 dp[i][0] = 1。通过上述状态转移方程,我们可以从 (1, 1) 位置开始,按照行优先或者列优先的顺序依次计算出网格中每个位置的 dp 值。最终,dp[m - 1][n - 1] 就表示机器人从左上角 (0, 0) 移动到右下角 (m - 1, n - 1) 的不同路径数量。

具体代码:

import java.util.Scanner;

public class UniquePaths {
    public static int uniquePaths(int m, int n) {
        // 创建一个二维数组 dp 来存储到达每个位置的不同路径数量
        int[][] dp = new int[m][n];

        // 初始化第一行,因为从左上角只能一直向右走到达第一行的每个位置,所以路径数都为 1
        for (int j = 0; j < n; j++) {
            dp[0][j] = 1;
        }

        // 初始化第一列,因为从左上角只能一直向下走到达第一列的每个位置,所以路径数都为 1
        for (int i = 0; i < m; i++) {
            dp[i][0] = 1;
        }

        // 从 (1, 1) 位置开始遍历整个网格
        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                // 状态转移方程:到达当前位置 (i, j) 的路径数等于到达上方位置 (i - 1, j) 的路径数加上到达左方位置 (i, j - 1) 的路径数
                dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
            }
        }

        // 最终结果存储在 dp[m - 1][n - 1] 中,表示到达右下角位置的不同路径数量
        return dp[m - 1][n - 1];
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 提示用户输入网格的行数
        System.out.print("请输入网格的行数 m: ");
        int m = scanner.nextInt();

        // 提示用户输入网格的列数
        System.out.print("请输入网格的列数 n: ");
        int n = scanner.nextInt();

        // 调用 uniquePaths 方法计算不同路径数量
        int result = uniquePaths(m, n);

        // 输出结果
        System.out.println("从左上角到右下角的不同路径数量为: " + result);

        // 关闭 Scanner 对象
        scanner.close();
    }
}

运行截图·:

相关文章:

  • LeetCodeHot100_0x07
  • 2025高频面试算法总结篇【递归回溯动态规划】
  • LabVIEW 线性拟合
  • Python核心语法-数据基本运算(一)
  • 笔记:代码随想录算法训练营day46:LeetCode647. 回文子串\516.最长回文子序列
  • JVM---Java 类生命周期与类加载机制
  • 高版本node(17+)环境下VUE2项目启动报错
  • 失败的面试经历(ʘ̥∧ʘ̥)
  • 从过拟合到强化学习:机器学习核心知识全解析
  • 关于playwright的data-testid
  • 深入探索Android Bitmap:从原理到实战
  • 【人工智能基础2】人工神经网络、卷积神经网络基础、循环神经网络、长短时记忆网络
  • 【排序】快速排序
  • Python —— random.choice()的用法
  • 数学——A. K-divisible Sum + D. Exam in MAC
  • Unity屏幕适配——立项时设置
  • 案例驱动的 IT 团队管理:创新与突破之路:第一章 重构 IT 团队管理:从传统到创新-1.2.2 方法论提炼:可复用的管理模型
  • 【uni-app运行错误】SassError: expected selector @import “@/uni.scss“;
  • 用通义大模型写爬虫程序,汇总各科成绩
  • Datawhale coze-ai-assistant 笔记3
  • 欧洲观察室|欧盟对华战略或在中欧建交50年时“低开高走”
  • 美俄亥俄州北部发生火车撞人事故,致2人死亡、至少1人失踪
  • 家国万里·时光故事会|构筑中国船舰钢筋铁骨,她在焊花里展现工匠风范
  • “南昌航空一号”成功发射,赣江鄱阳湖有了专属卫星守护
  • 国宝归来!子弹库帛书二、三卷抵达北京
  • 美国失去最后一个AAA评级,资产价格怎么走?美股或将触及天花板