LCR 098. 不同路径 - 力扣(LeetCode)
题目描述:
一个机器人位于一个
m x n
网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?
拿示例一举例,已知机器人每次只能向右边或者向下边移动一步。
若将整个网格看做一个二维数组dp[n][m],则☆处的位置为dp[i][j],故可得方程:dp[i][j]=dp[i-1][j]+dp[i][j-1]。
如果直接使用dp[i][j]=dp[i-1][j]+dp[i][j-1]的话会导致越界问题,例如如上图当i=0,j=0时,方程就变成了dp[0][0]=dp[-1][0]+dp[0][-1],导致了越界。因此我们需要进行边界处理。
第一种
我们可以发现机器人从起点开始一直沿着右边或者一直沿着下边走,无论走到哪个格子都只有一种路径,因此我们可以直接提前将dp[0][j]和dp[i][0]都设置为1。如果终点不在第一行第一列的话直接从dp[1][1]开始遍历计算求解。
如图所示:
class Solution {
public:int uniquePaths(int m, int n) {vector<vector<int>> dp(m,vector<int>(n,0));if(m==1||n==1){return 1;}else{for(int j=0,i=0;i<m;i++)//列{dp[i][j]=1;}for(int i=0,j=0;i<n;i++)//行{dp[j][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];} }
};
第二种
我们可以根据所得方程dp[i][j]=dp[i-1][j]+dp[i][j-1],在上边缘和左边缘新开辟一行一列,让这新开辟的一行一列辅助dp数组去进行初始化边缘。这就需要我们对多余开辟的数组空间进行相应初始化。如图所示:
根据方程可以简单看做终点处路径数量等于终点的上面一个格子与终点的左边一个格子的路径和。故只需要将机器人头上的格子设为1(或者将机器人左边的格子设为1),空白处为0。即可满足题意。
代码:
class Solution {
public:int uniquePaths(int m, int n) {vector<vector<int>> dp(m+1,vector<int>(n+1,0));dp[0][1]=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][n];}
};