动态规划三:不同路径 | Java刷题打卡

195 阅读2分钟

本文正在参加「Java主题月 - Java 刷题打卡」,详情查看 活动链接

一、题目:62.不同路径

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

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

二、解析

确定dp数组及下标含义

本题dp数组为一个二维数组,dp[i][j]:表示从(0,0)走到(i,j)有dp[i][j]条不同路径。

确定递推公式

机器人每次只能向下或者向右移动一步,要移动到(i,j),则只能从(i-1,j)或(i,j-1)这两个位置过来,则有dp[i][j]=dp[i-1][j] + dp[i][j-1]。

dp数组初始化

在第0行中,要移动到(0,j)位置,则只能从左边的位置移动过去;同理在第0列中,要移动到(i,0)位置,则只能从上边的位置移动过去。所以dp[0][j]一定都是1,因为从(0, 0)的位置到(0, j)的路径只有一条,同样dp[i][0]也都是1。

// 初始化
int[][] dp = new int[m][n];
for (int i = 0; i < m; i++) dp[i][0] = 1;
for (int i = 0; i < n; i++) dp[0][i] = 1;

遍历顺序

机器人从(0,0)位置开始移动,dp数组遍历可以嵌套两层循环,依次遍历即可。

举例推导dp数组

1111111
1234567
13610152128

三、代码实现

class Solution {
    public 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 i = 0; i < n; i++) dp[0][i] = 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];
            }
        }
        return dp[m - 1][n - 1];
    }
}

四、进阶

63.不同路径II