程序员升级打怪第5关:机器人有多少种到达终点的路?

大家好 我是“@不会飞的小飞驴”

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

示例 1:
在这里插入图片描述

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

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

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

首先 大家思考一下看有什么好方法,欢迎大家在下方评论。

整体思路:这道题主要用到思路是:动态规划解决
注意这里机器人只能向下和向右移动,不能往其他方向移动,我们用dp[i][j]表示到坐标(i,j)这个格内有多少条不同的路径,所以最终的答案就是求dp[m-1][n-1]。
因为只能从上面或左边走过来,所以递推公式是
dp[i][j]=dp[i-1][j]+dp[i][j-1]。

dp[i-1][j]表示的是从上面走过来的路径条数。
dp[i][j-1]表示的是从左边走过来的路径条数。
在这里插入图片描述

那么边界条件是什么呢,如果Finish在第一行的任何位置都只有一条路径,同理Finish在第一列的任何位置也都只有一条路径,所以边界条件是第一行和第一列都是1。我们已经找到了递推公式,又找到了边界条件,所以动态规划程序代码如下:
程序:

public int uniquePaths(int m, int n) {
    
    
    int[][] dp = new int[m][n];
    //第一列都是1
    for (int i = 0; i < m; i++) {
    
    
        dp[i][0] = 1;
    }
    //第一行都是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];
}

猜你喜欢

转载自blog.csdn.net/u014251610/article/details/113747805