LeetCode刷题——动态规划,No.62不同路径
2019-06-02 22:42
134 查看
题目是这样的:
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。
问总共有多少条不同的路径?
例如,上图是一个7 x 3 的网格。有多少可能的路径?
说明:m 和 n 的值均不超过 100。
示例 1:
[code]输入: m = 3, n = 2 输出: 3 解释: 从左上角开始,总共有 3 条路径可以到达右下角。 1. 向右 -> 向右 -> 向下 2. 向右 -> 向下 -> 向右 3. 向下 -> 向右 -> 向右示例 2:
[code]输入: m = 7, n = 3 输出: 28
看到这道题目我第一开始的想法是深度优先搜索,然后没搜到一条不重复的路就把总路径数加一,但是看到m,n均不超过100,算了下,大致为2^100次方,肯定会超时,所以只能考虑其他的算法。
其实具体看到“求出总的路径数”这种只需要输出最终结果的描述就能够想到,既然只需要输出路径数量,而不是每条路径,那么我可不可以推导一下规律,然后直接用规律来解题呢?(笑)于是,就分析分析到达第 i 行 第 j 列的位置上,一共有多少条路径可走。考虑到每次只能向右或者向下走一步,那么到达map[i][j] 位置的上一步无非是来自于上或者左,即:到达map[i][j] 时的路径总数为到达map[i-1][j] 的路径数与到达map[i][j-1]的路径数之和。而因为在第1行中,每一步都只能来源于左方,所以只能是左方的路径数,在第1列中,每一步只能来源于上方,所以只能是上方的路径数。
递推公式:
填充方式:直接按照横向或者纵向填都行
代码:
[code]class Solution { public: int uniquePaths(int m, int n) { int a[m+5][n+5]={0}; a[1][1] = 1; for(int i=2;i<=m;i++) { a[i][1]=1; } for(int i=2;i<=n;i++) { a[1][i]=1; } for(int i=2;i<=m;i++) { for(int j=2;j<=n;j++) { a[i][j]=a[i-1][j]+a[i][j-1]; } } return a[m] ; } };
这里要注意一下:如果m、n都为1的话,也就是说自己到自己也是要算做一条路的,所以在初始化时,dp[1][1]=1;
相关文章推荐
- LeetCode62. 不同路径 动态规划 python3实现
- Leetcode 062 不同路径 Python (动态规划)
- LeetCode 63.不同路径II
- LeetCode题库解答与分析——#63.不同路径IIUniquePathsII
- [LeetCode]63 不同的路径总数之二
- Leetcode 62&63&64 不同路径 Java
- LeetCode62-不同路径
- [LeetCode] Unique Paths II 不同的路径之二
- LeetCode 63. Unique Path II(所有不同路径之二)
- LeetCode980. 不同路径 III(python)
- Leetcode-64_. Minimum Path Sum(最小路径和)—动态规划解法+记忆化搜索解法-C++解
- LeetCode-95.不同的二叉搜索树II(相关话题:动态规划)
- LeetCode-63. 不同路径 II
- LeetCode62/63. 不同路径问题(python)
- Leetcode 063 不同路径|| Python C++ 详细题解
- LeetCode-115.不同的子序列(相关话题:动态规划)
- LeetCode63. 不同路径 II 动态规划 python3
- leetcode62. 不同路径(dp)
- LeetCode --- 62. 不同路径
- 算法题目总结 -- 不同路径( leetcode62题)