力扣 62. 不同路径
难度 中等
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。
问总共有多少条不同的路径?
例如,上图是一个7 x 3 的网格。有多少可能的路径?
示例 1:
输入: m = 3, n = 2
输出: 3
解释:
从左上角开始,总共有 3 条路径可以到达右下角。
1 向右 -> 向右 -> 向下
2 向右 -> 向下 -> 向右
3 向下 -> 向右 -> 向右
示例 2:
输入: m = 7, n = 3
输出: 28
提示:
1 <= m, n <= 100
题目数据保证答案小于等于 2 * 10 ^ 9
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/unique-paths
本题是一个有关动态规划的题目,首先,动态规划最重要的是掌握他的思想,动态规划的核心思想是把原问题分解成子问题进行求解,也就是分治的思想。
本题中m×n的表格中机器人一定会走m+n-2
步,即从m+n-2中挑出m-1步向下走不就行了吗?即C((m+n-2),(m-1))
。
C(m,n)是数学公式
C(m,n)=m×(m-1)×……×(m-n+1)/n×(n-1)^……3×2×1
C(10,3)=10×9×8/3×2×1
到了本题上这样计算是不是根本不懂怎么用这个公式??
那么我这么说,你应该就懂了→重点!
1.从第一个格子开始,我们每一个格子计算到这个格子的路径数
2.每一个格子的路径数就等于它上面格子和左边格子路径的和
3.第一行和第一列的格子路径数都为1
最后,我们只需要拿到最后一个格子的路径返回即可!
上代码👇
public class _62_不同路径 {
public static int uniquePaths(int m, int n) {
int [][]dp = new int[m][n];
for(int i = 0;i<m;i++){
for(int j = 0;j<n;j++){
if(j==0||i==0){
dp[i][j]=1;
}else{
dp[i][j]=dp[i][j-1]+dp[i-1][j];
}
}
}
return dp[m-1][n-1];
}
public static void main(String[] args) {
System.out.println(uniquePaths(7,3));
}
}
数组只用到上一个状态,因此可以只用一个一维数组,优化空间复杂度
public class _62_不同路径 {
public static int uniquePaths(int m, int n) {
int[] dp = new int[n+1];
for(int i = 0; i < m; i++){
for(int j = 1; j <= n; j++){
if(dp[j-1] == 0){ //边界
dp[j] = 1;
}
else{ //状态转移方程
dp[j] = dp[j-1] + dp[j];
}
}
}
return dp[n];
}
public static void main(String[] args) {
System.out.println(uniquePaths(7,3));
}
}