「这是我参与2022首次更文挑战的第38天,活动详情查看:2022首次更文挑战」。
不同路径
题目描述
一个机器人位于一个m*n网格的左上角(起始点在下图中标记为"start")。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为"Finish")。
问总共有多少条不同的路径?
示例1:
输入: m = 3, n = 7
输出: 28
示例2:
输入:m = 3, n = 2
输出:3
解释:
从左上角开始,总共有 3 条路径可以到达右下角。
1. 向右 -> 向下 -> 向下
2. 向下 -> 向下 -> 向右
3. 向下 -> 向右 -> 向下
示例3:
输入: m = 7, n = 3
输出: 28
示例4:
输入: m = 3, n = 3
输出: 6
算法解析
这道题目本质上是用动态规划求解不同路径问题,在之前的力扣题解中,我们简单复习了动态规划的一些简单的概念,实质上动态规划我们可以将它看作是当下的状态时前一个状态推导出来的,主要就是它的动态的概念,它的状态是可以随着前面状态的不同而变化的。
对于动态规划问题,它的解题步骤主要可以分成如下4步:
1.确定状态
状态:解动态规划的时候需要开一个数组,每个数组的每个元素所代表的含义就是状态。
本题中确定dp数组dp[i][j]:表示机器人从(0,0)出发,到(i,j)有dp[i][j]条不同的路径。
i和j为变量
2.转移方程
就把"确定状态"中状态表达式,写出来。
本题中其实就是确定一个递推公式:
dp[i][j]=dp[i-1][j]+dp[i][j-1]
3.初始条件和边界条件
初始条件:dp[i][0]=1,dp[0][j]=1
边界条件:i<m,j<n
4.计算顺序
这里的计算顺序指的是从左到右一层一层遍历
以上就是这道不同路径的算法思路,根据算法思路我们来进行编程。
代码解析
class Solution {
public int uniquePaths(int m, int n) {
//确定dp[][]数组
int[][] dp=new int[m][n];
//确定初始条件
for(int i=0;i<m;i++){
dp[i][0]=1;
}
for(int j=0;j<n;j++){
dp[0][j]=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];
}
}