62.不同路径
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?
示例 1:
- 输入:m = 3, n = 7
- 输出:28
示例 2:
- 输入:m = 2, n = 3
- 输出:3
解释: 从左上角开始,总共有 3 条路径可以到达右下角。
- 向右 -> 向右 -> 向下
- 向右 -> 向下 -> 向右
- 向下 -> 向右 -> 向右
示例 3:
- 输入:m = 7, n = 3
- 输出:28
示例 4:
- 输入:m = 3, n = 3
- 输出:6
提示:
- 1 <= m, n <= 100
- 题目数据保证答案小于等于 2 * 10^9
- 根据数据的维度,建立一维或者二维数据区域,这是二维区域,就做成二维表格
- 初始化好值,因为第一行和第一列只要一种路线,所以初始化值为1
- 分析dp [i]的含义,dp [ i ]为当当前位置有多少种走法,就是把从左边来的所有走法和从上面来的所有走法加起来
- 根据dp[i]怎么来到的,构建赋值等式,也就是状态转移方程
package com.programmercarl.dynamic;
/**
* @ClassName UniquePaths
* @Descriotion TODO
* @Author nitaotao
* @Date 2022/7/23 9:13
* @Version 1.0
* https://leetcode.cn/problems/unique-paths/
* 62. 不同路径
**/
public class UniquePaths {
public int uniquePaths(int m, int n) {
/**
* dp[ i ] 到达本位置有多少种走法
*/
int[][] dp = new int[m][n];
dp[0][0] = 0;
//初始化第一行
for (int i = 0; i < n; i++) {
dp[0][i] = 1;
}
//初始化第一列
for (int i = 1; i < m; i++) {
dp[i][0] = 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];
}
}