【代码随想录day 34】 力扣 62.不同路径
视频讲解:https://www.bilibili.com/video/BV1ve4y1x7Eu/?vd_source=a935eaede74a204ec74fd041b917810c
文档讲解:https://programmercarl.com/0062.%E4%B8%8D%E5%90%8C%E8%B7%AF%E5%BE%84.html#%E6%80%9D%E8%B7%AF
力扣题目:https://leetcode.cn/problems/unique-paths/
这道题还是按照动归五步法
- 确定dp[i][j] 含义:dp[i][j]表示(i, j)这个点有几种走法
- 递推公式:因为一个点只能由上面的点和左面的点走到,所以dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
- 初始化:任意一个点都是由上面或左面推导而来,所以初始化最上一行和最左一列
- 遍历顺序:从左往右,从上往下
- 输出打印
这里需要注意的是,m*n的网格dp[i][0]表示最左一列,dp[0][j]表示最上一行,所以初始化dp的时候不要搞混,容易越界访问。
class Solution {
public:int uniquePaths(int m, int n) {//1. dp[i][j]表示(i, j)这个点有几种走法//2. 递推公式:因为一个点只能由上面的点和左面的点走到,所以dp[i][j] = dp[i - 1][j] + dp[i][j - 1];//3.初始化:任意一个点都是由上面或左面推导而来,所以初始化最上一行和最左一列vector<vector<int>> dp(m, vector<int>(n,0));//纵向遍历改变的是第一个值,横向便利改变的是第二个值for(int i = 0; i < m; ++i){dp[i][0] = 1;}for(int j = 0; j < n; ++j){dp[0][j] = 1;}//4.遍历顺序:从左往右,从上往下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];//cout<< "(" << i << "," << j << "):" << dp[i][j] << endl;}}//因为是m*n,从0开始,所以最右下角是dp[m - 1][n - 1]return dp[m - 1][n - 1];}
};