【动态规划】【打卡106天】:62. 不同路径

1、题目描述

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

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

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

 2、算法分析

题目说的是,给定m行n列的网格,有一个机器人从左上角(0,0)出发,每一步可以向下,也可以向右。问有多少种不同的方式。

dp[i][j] :表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路径。

最后一步:

        无论机器人用何种方式到右下角,总有最后挪动的一步:向右或者想下。

        右下角的坐标是(m-1,n-1),那么前一步机器人一定是在(m-1,n-1)或者(m-1,n-2)

那么机器人有X种方式(m-2,n-1)有Y种方式从左上走到(m-1,n-2)则机器人有X+Y种方式走到(m-1,n-1)。则问题转化成,机器人有多少种方式从左上角走到(m-2,n-1)和(m-1,n-2)上。也就变成了子问题。

具体看代码:

3、代码实现

  /**
     * 1. 确定dp数组下表含义 dp[i][j] 到每一个坐标可能的路径种类
     * 2. 递推公式 dp[i][j] = dp[i-1][j] dp[i][j-1]
     * 3. 初始化 dp[i][0]=1 dp[0][i]=1 初始化横竖就可
     * 4. 遍历顺序 一行一行遍历
     */
class Solution {
    public int uniquePaths(int m, int n) {
        // m行n列的网格
        int[][] f = new int[m][n];
        int i,j;
        // 行,从上到下
        for(i = 0;i < m;i++){
            // 列,从左到右
            for(j = 0;j < n;j++){
                // 当i,j为0的时候,是1
                // dp[i][j] :表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路径。
                // 首先dp[i][0]一定都是1,因为从(0, 0)的位置到(i, 0)的路径只有一条,那么dp[0][j]也同理。
                if(i ==0 || j ==0){
                    f[i][j] = 1;
                }else{
                    f[i][j] = f[i-1][j] + f[i][j-1];
                }
            }
        }

        return f[m-1][n-1];
    }
}

猜你喜欢

转载自blog.csdn.net/Sunshineoe/article/details/121499468
今日推荐