一【题目类别】
- 动态规划
二【题目难度】
- 中等
三【题目编号】
- 62.不同路径
四【题目描述】
- 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
- 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
- 问总共有多少条不同的路径?
五【题目示例】
- 示例 1:
输入:m = 3, n = 7
输出:28 - 示例 2:
输入:m = 3, n = 2
输出:3
解释:
从左上角开始,总共有 3 条路径可以到达右下角。
①:向右 -> 向下 -> 向下
②:向下 -> 向下 -> 向右
③:向下 -> 向右 -> 向下 - 示例 3:
输入:m = 7, n = 3
输出:28
示例 4:
输入:m = 3, n = 3
输出:6
六【题目提示】
- 1 < = m , n < = 100 1 <= m, n <= 100 1<=m,n<=100
- 题 目 数 据 保 证 答 案 小 于 等 于 2 ∗ 1 0 9 题目数据保证答案小于等于 2 * 10^9 题目数据保证答案小于等于2∗109
七【解题思路】
- 因为题目说机器人只能向下走或者向右走,所以第一行和第一列的所有元素位置只能走直线到达,那么可以到达的不同路径数目就是1,同样因为题目说机器人只能向下走或者向右走,因为之前的状态已经更新,那么除了第一行和第一列的所有位置都可以更新为左面和上面过来的可到达的不同路径数目之和,最终动态数组到达右下角就更新为所有不同路径的数目
八【时间频度】
- 时间复杂度: O ( M ∗ N ) O(M*N) O(M∗N),M为二维数组的行数,N为二维数组的列数
九【代码实现】
- Java语言版
package DynamicProgramming;
public class p62_UniquePaths {
public static void main(String[] args) {
p62_UniquePaths p62_uniquePaths = new p62_UniquePaths();
int res = p62_uniquePaths.uniquePaths(7, 3);
System.out.println("res = " + res);
}
public int uniquePaths(int m, int n) {
int[][] temp = new int[m][n]; // 生成对应的二维数组
// 因为第一列不管到哪个位置都只有一条路径,所以置为1
for (int i = 0; i < m; i++) {
temp[i][0] = 1;
}
// 因为第一行不管到哪个位置都只有一条路径,所以置为1
for (int i = 0; i < n; i++) {
temp[0][i] = 1;
}
// 然后开始遍历每一个元素,因为最终到达点肯定是从左面或者上面进入的,所以最终点的路径就是左面的之前路径和加上上面的之前路径和
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
temp[i][j] = temp[i - 1][j] + temp[i][j - 1];
}
}
return temp[m - 1][n - 1];
}
}
- C语言版
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int uniquePaths(int m, int n)
{
/*动态数组,存放每一个位置可以到达的不同路径数目*/
int** dp = (int **)malloc(sizeof(int *)*m);
for (int i = 0; i < m; i++)
{
dp[i] = (int*)calloc(n, sizeof(int));
}
/*遍历每一个位置*/
for (int x = 0; x < m; x++)
{
for (int y = 0; y < n; y++)
{
/*因为题目说机器人只能向下走或者向右走,所以第一行和第一列的所有元素位置只能走直线到达,那么可以到达的不同路径数目就是1*/
if (x == 0 || y == 0)
{
dp[x][y] = 1;
}
/*同样因为题目说机器人只能向下走或者向右走,因为之前的状态已经更新,那么除了第一行和第一列的所有位置都可以更新为左面和上面过来的可到达的不同路径数目之和*/
else
{
dp[x][y] = dp[x - 1][y] + dp[x][y - 1];
}
}
}
/*最终动态数组到达右下角就更新为所有不同路径的数目*/
return dp[m - 1][n - 1];
}
/*主函数省略*/
十【提交结果】
-
Java语言版
-
C语言版