【leetCode-DP】62. 不同路径

题目

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。

问总共有多少条不同的路径?(从坐上角走到右下角)

 

 

例如,上图是一个7 x 3 的网格。有多少可能的路径?

说明:m 和 n 的值均不超过 100。

示例 1:

输入: m = 3, n = 2
输出: 3
解释:
从左上角开始,总共有 3 条路径可以到达右下角。
1. 向右 -> 向右 -> 向下
2. 向右 -> 向下 -> 向右
3. 向下 -> 向右 -> 向右

示例 2:

输入: m = 7, n = 3
输出: 28

题解

       这道题拿到题目我觉得大家的第一反应都是这应该是递归的题目,因为我们可以转化为子问题,但是这样暴力肯定会超时,就不用尝试了。其实在该题递归的方法就是从上面到下面不断的去尝试,如果我们能记住之前的结果,就对我们下一步有帮助,所以想到了DP的方法。

那么需要我们遵循DP求解的步骤:
 

1).定义一个能够清楚描述最优子问题的数组(明确数组描述的含义)。

2).找出数组元素之间的关系式(状态转移方程)

3).找出初始值


格子中的数字代表当前的方法.

1.定义dp[i][j] 代表 当前位置(i,j)有多少种方式能够走到这个位置

2.我们知道dp[i][j]由 dp[i-1][j]或者dp[i][j-1]转移过来 由此我们可以得到状态转移方程: dp[i][j] = dp[i][j-1] + dp[i-1][j];

3.初始化 

 

  1. 当前这个状态只和左边和上边的格子有关系,并且依次求解:

 

优化

上面我们在求解的时候,发现并不需要保存整个矩阵的状态,只需要当前行和当前列即可,同时又可以进一步优化,当前行我们可以使用外层循环的方式,状态累加到dp[j]上 ,于是状态转移方程编程:
res[j] = res[j] + res[j-1]

        dp[1] = 1;
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                dp[j] += dp[j - 1];
            }
        }
        return dp[m];

参考: https://segmentfault.com/a/1190000016315625

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章