不同路径--动态规划

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

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

问总共有多少条不同的路径?

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

示例1:

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

示例2:

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

解法一: 动态规划

我们令dp[i][j]是到达i, j 最多路径

动态方程: dp[i] [j] = dp[i-1] [j] + dp[i] [j-1]

注意,对于第一行dp[0] [j]或者第一列dp[i][0],由于都是在边界,所以只能为1

时间复杂度O(m * n), 空间复杂度为S(m * n)

优化下,所以我们只需要每次计算dp[i - 1][ j ]与dp[ i ][j - 1],我们可以先初始化第一行,第一列所有元素为1,其他待定即可

代码如下:

func uniquePaths(_ m: Int, _ n: Int) -> Int {
    guard m > 0 ,n > 0 else { return 0 }
    var dp = [[Int]]()

    /***创建第一行第一列元素为1*/
    for i in 0 ..< m {
        var row = [Int]()
        for j in 0 ..< n {
            if i == 0 {
                row.append(1)
            } else {
                if j == 0 {
                    row.append(1)
                }
            }

        }
        dp.append(row)
    }
    /*********************/

    //从第二列第二行开始
    for i in 1..<m {
        for j in 1..<n {

            dp[i].append(dp[i - 1][j] + dp[i][j - 1])
        }
    }
    //返回最右下标
    return dp[m - 1][n - 1]
}

uniquePaths(3, 7)

执行完结果如下

在leetCode上结果如下

上面就是动态规划下不同路径的算法思想和代码,可以直接运行,希望对大家有所帮助!!!

原文地址:https://www.cnblogs.com/guohai-stronger/p/11818166.html

时间: 2024-10-18 20:48:11

不同路径--动态规划的相关文章

不同路径—动态规划

思路:第一行和第一列的元素都有一条路径可以到达,将对应位置赋值为1.接下来每个位置处都可以从其上边或左边到达. 1 int uniquePaths(int m, int n) { 2 // write your code here 3 int ** s = new int*[m]; 4 for (int i = 0; i < m; i++) { 5 s[i] = new int[n]; 6 } 7 for (int i = 0; i < m; i++) { 8 s[i][0] = 1; 9 }

63. Unique Paths II(有障碍的路径 动态规划)

Follow up for "Unique Paths": Now consider if some obstacles are added to the grids. How many unique paths would there be? An obstacle and empty space is marked as 1 and 0 respectively in the grid. For example, There is one obstacle in the middl

LeetCode -- Triangle 路径求最小和( 动态规划问题)

人们常说"细节决定成败". 编码工作中,同样需要关注细节. 本文将给出3个小实例来说明编码中关注细节的重要性,同时给出作者对如何注意编码细节的一点见解(说的不对,请指正). 例1 这个问题如此地显而易见,竟然没有被发现. List<int> numList = new List<int>(); numList.Add(3); numList.Add(1); numList.Add(4); numList.Add(2); numList.Add(5); numLi

动态规划---从左上角到右下角的价值最大的路径

编程题:动态规划---从左上角到右下角的价值最大的路径 腾讯2016年4月2号暑假实习移动开发岗的笔试题,编程题第一题大概题目是: 一个m*n的矩阵,只能向右走或是向下走,矩阵每一个元素代表一个财富值,要求打印出从左上角到右下角走的财富最大总值. 如输入m=4 ,n=5, 输入矩阵value= { 0 0 7 0 0, 0 0 0 5 0, 2 0 4 0 0, 0 0 0 3 0}, 打印出最大财富总值是15. 这是动态规划的题目,跟"[leetcode 64] Minimum Path Su

HDU 1160 FatMouse&#39;s Speed 动态规划 记录路径的最长上升子序列变形

题目大意:输入数据直到文件结束,每行两个数据 体重M 和 速度V,将其排列得到一个序列,要求为:体重越大 速度越低(相等则不符合条件).求这种序列最长的长度,并输出路径.答案不唯一,输出任意一种就好了. 题目思路:这是个最长上升子序列的问题,我们按W的升序进行排序,若W相等则按V的降序排序.用Pre[]记录当前点的前驱节点,Last记录序列最后一个点,maxn记录最长长度,完成动规后可根据Last和Pre[]输出路径. #include<cstdio> #include<stdio.h&

小乐乐要下山(脑残动态规划记录路径)

哈尔滨理工大学OJ上的题目,水是很水,结果我做了好久,发现题中要循环输入,我也是醉了. 题目很简单但是心里不平衡决定发一下. Description 上学的路总是那么艰辛,在小乐乐辛苦的出了家门之后,她才想起自己的家已经搬到山上了(睡的真迷糊).下山的路同样十分艰难,不同的地方通行的难易程度也不同.如图所示,小乐乐现在在山顶上,她面前有两条路,每条路通往一个地点,每个地点有一个值,表示这个通行的难易程度.最底层的地点就是山脚了.大家知道,小乐乐好懒好懒的,她想知道怎么下山最省力? Input 第

3、动态规划问题中的最优路径保存与输出

在动态规划问题中,我们经常会遇到以下问题,最优解倒是求出来了,但是最优解的路径呢?如何输出?这确实是一个问题,而且往往比较难哟.. 我这里说的路径是指,像在钢条切割问题中,从哪些地方切可以达到最优化,在矩阵链乘问题中,从哪些地方进行组合可以使效率最高? 在钢条切割问题中: for(j=1;j<=i; j++){ if(priceStore[i-j]+ironPrice[j-1]>price){ pathStore[i]=j; //意思为使是长度为i的钢条价格达到最优,需要从第j个位置进行截断,

UniquePaths,UniquePaths2,路径问题。动态规划。

UniquePaths:给定m*n矩阵,从(0,0)到(m-1,n-1)路径条数.只能向下向右走. 算法分析:这和爬楼梯问题很像,到(m,n)的路径数是到(m-1,n)和(m,n-1)路径和.第一行,第一列,为边界条件. public class UniquePaths { //动态规划,非递归 public int uniquePaths(int m, int n) { int[][] a = new int[m][n]; for(int i = 0; i < m; i ++)//初始条件,第

FatMouse&#39;s Speed hdu 1160(动态规划,最长上升子序列+记录路径)

http://acm.hdu.edu.cn/showproblem.php?pid=1160 题意:现给出老鼠的体重与速度,要求你找出符合要求的最长子序列.       要求是 W[m[1]] < W[m[2]] < ... < W[m[n]](体重) && S[m[1]] > S[m[2]] > ... > S[m[n]] (速度) 分析:有两个变量的话比较不好控制,自然需要先排序.再仔细思考的话,觉得和之前做的防御导弹有点类似,都是求最多能有几个符合