美文网首页剑指offer
LeetCode62-不同路径-动态规划

LeetCode62-不同路径-动态规划

作者: 依然慢节奏 | 来源:发表于2020-04-10 19:48 被阅读0次

    题目描述

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

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

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

    图表
    示例 1:
    
    输入: m = 3, n = 2
    输出: 3
    解释:
    从左上角开始,总共有 3 条路径可以到达右下角。
    1. 向右 -> 向右 -> 向下
    2. 向右 -> 向下 -> 向右
    3. 向下 -> 向右 -> 向右
    
    示例 2:
    
    输入: m = 7, n = 3
    输出: 28
    

    提示:
    1 <= m, n <= 100
    题目数据保证答案小于等于 2 * 10 ^ 9

    思路分析

    动态规划三步:

    • 第一步找到dp数组的定义,我们可以定义dp[i][j]表示从(0,0)坐标点出发到达坐标点(i,j)的所有路径,对于mn列的所有路径就是dp[m-1][n-1]的值;
    • 第二步是找到数组元素之间的关系。首先考虑第一行和第一列的情况,因为只能向下和向右,第一行只能一直向右走,第一列只能向下走(不能向左或向上),所以dp[0][i]dp[j][0]的值为1;针对于中间的坐标点(i,j),i>0,j>0有两个方向可以到达,一个方向是(i-1,j),一个方向是(i,j-1),分别从它上边和左边,所以我们可以得到关系:dp[i][j]=dp[i-1][j]+dp[i][j-1],i>0,j>0
    • 第三步找到初始值,在第二步的时候我们已经知道了第一行和第一列的值为1

    代码实现

    public class Solution62 {
        public int uniquePaths(int m, int n) {
            //`dp[i][j]`表示从`(0,0)`坐标点出发到达坐标点`(i,j)`的所有路径
            int[][] dp = new int[m][n];
            ///第一行
            for (int i = 0; i < n; i++) {
                dp[0][i] = 1;
            }
            ///第一列
            for (int i = 0; i < m; i++) {
                dp[i][0] = 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];
        }
    
        public static void main(String[] args) {
            Solution62 solution62 = new Solution62();
            System.out.println("res:" + solution62.uniquePaths(3, 2));
            System.out.println("res:" + solution62.uniquePaths(7, 3));
        }
    }
    

    欢迎关注南阁公众号

    南阁子也

    相关文章

      网友评论

        本文标题:LeetCode62-不同路径-动态规划

        本文链接:https://www.haomeiwen.com/subject/yzkdmhtx.html