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

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

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

思路一:排列组合

因为机器到底右下角,向下几步,向右几步都是固定的,

比如,m=3, n=2,我们只要向下 1 步,向右 2 步就一定能到达终点。

直接计算C(m+n-2,m-1)即可。时间复杂度为O(n),空间复杂度O(1)

思路二:动态规划

1、确定状态方程

dp[i][j]表示从头开始到i、j的路径数。

2、确定状态转移方程

因为想要到达i,j其实只有两个方向,一个是从上方,一个是从左方,即i-1和j-1,两个方向的和即为目前的路径数。dp[i][j] = dp[i-1][j] + dp[i][j-1]

3、确认边界条件

需要注意边界值,当i、j到达0的时候,即为到达边界,也就只有一个方向,返回1

注意:题目中的 n 是行row,而 m 才是列column。

class Solution {
public:
    int uniquePaths(int m, int n) {
        vector<vector<int>> dp(n,vector<int>(m,0));
        for(int i = 0 ; i < n ; i++)
        {
            for(int j = 0 ; j < m ; j++)
            {
                if( i == 0 || j == 0)
                    dp[i][j] = 1;
                else
                {
                    dp[i][j] = dp[i-1][j] + dp[i][j-1];
                }
            }
        }
        return dp[n-1][m-1];
    }
};