动态规划---不同路径 Posted on 2021-08-23 00:00:00 2021-08-23 00:00:00 by Author 摘要 给定一个网格,你从起始点开始,每一次只能往下或者往右走,那么到达终点你能知道有多少种路径吗??? # 动态规划---不同路径 1. 题目描述 - 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。 问总共有多少条不同的路径? - **提示:** - `1 <= m, n <= 100` - 题目数据保证答案小于等于 `2 * 109` 2. 示例描述 - 示例一  ```java 输入:m = 3, n = 7 输出:28 ``` - 示例二 ```java 输入:m = 3, n = 2 输出:3 解释: 从左上角开始,总共有 3 条路径可以到达右下角。 1. 向右 -> 向下 -> 向下 2. 向下 -> 向下 -> 向右 3. 向下 -> 向右 -> 向下 ``` 3. 解题思路 - 对于这道题来说,算是非常简单的题目了,看完题目之后就会有思路,每到达一个地方都有两种来源,一个就是从上方来的,还有一个就是从左方来的,而题目说了,算出到达目的地的总路径,那么每到达一个地方,它的总路径就是从上方来的总路径与从左方来的总路径之和,就是到达这个地方所有路径了。 - 那么对于第一行,没有从上方来的路径,只有从左方来的路径,而且移动只能从上到下,从左到右,那么第一行每个位置都是从左方移动来的,所有第一行每个位置的路径都为1。同理第一列也是,只有从上方来的路径,没有从左方来的路径,所以第一列位置的路径和都是1。这样对于其他的位置,都可以从上方来,或者从左方来,所以其他位置的总路径就是上方路径和与左方路径的和。而本题要求算出最后一个位置的路径和,那么遍历所有的位置,返回最后一个位置的路径即可。 - 本题非常简单,并且是动态规划经典的入门题,实现起来也非常简单,具体实现如下所示。 4. 代码示例 ```java public int uniquePaths(int m,int n){ //定义dp数组 //数组下标代表每个位置 //每个元素存放的是该位置所有路径的和 int f[][]=new int[m][n]; //初始化第一列 for(int i=0;i<m;i++){ f[i][0]=1; } //初始化第一行 for(int i=0;i<n;i++){ f[0][i]=1; } for(int i=1;i<m;i++){ for(int j=1;j<n;j++){ //计算数组每个元素的值 //即为从上方来的与从左方来的路径总和 f[i][j]=f[i-1][j]+f[i][j-1]; } } //返回最终结果 return f[m-1][n-1]; } ```
{{ item.content }}
{{ child.content }}