LeetCode62. 不同路径


由于机器人只可以向右和向下移动,所以我们要到第i行第j列,只可以由第i-1行第j列和第i行第j-1列移动一步得到,因此要到第i行第j列的方案数就是到第i-1行第j列的方案数和到第i行第j-1列的方案数之和。如果用dp[i][j]表示到第i行第j列的方案数,我们可以得到状态转移方程:dp[i][j] = dp[i - 1][j] + dp[i][j - 1],得到状态转移方程后,我们还需要做一些初始化方便递推。可以发现第0行和第0列的所有方案数都是1(只可能是从起点开始不断向下或向右移动得到). 这样我们递推的时候只需从第1行第1列开始递推到第m-1行n-1列。

class Solution {
public:
    int uniquePaths(int m, int n) {
        vector<vector<int>> dp(m, vector<int>(n));
        for(int i = 0; i < m; ++i) {
            dp[i][0] = 1;                        //到第0列的所有格子都只有一种路径(向下)
        }
        for(int i = 0; i < n; ++i) {
            dp[0][i] = 1;                        //到第0行的所有格子都只有一种路径(向右)
        }
        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];       //到第i行第j列只可能是从第i - 1行第j列或第i行第j - 1列移动一步得到
                                                              //因此到第i行第j列的方案数就是第i - 1行第j列的方案数和第i行第j - 1列的方案数之和      
            }
        }
        return dp[m - 1][n - 1];                  //右下角是第m - 1行第n - 1列
    }
};
原文地址:https://www.cnblogs.com/linrj/p/13206523.html