【动态规划篇】路径总数&&最小路径和

简介: 【动态规划篇】路径总数&&最小路径和

👉不同路径👈


一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?

c9f16ffd6236466e826178e5915f0e68.png

思路:

7e259266a66d4ae9815c825d68ec0f43.png



class Solution 
{
public:
    int uniquePaths(int m, int n) 
    {
        vector<vector<int>> pathNum(m, vector<int>(n, 1));  // 已经设置好初始状态了
        for(int i = 1; i < m; ++i)
        {
            for(int j = 1; j < n; ++j)
            {
                pathNum[i][j] = pathNum[i - 1][j] + pathNum[i][j - 1];
            }
        } 
        return pathNum[m - 1][n - 1];
    }
};

591627a62dfd40b68d733757072594d3.png


👉不同路径II👈


一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。

 

现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?


网格中的障碍物和空位置分别用 1 和 0 来表示。

c517953453f645d5a68f60a10d7120b8.png



思路:

fdd4cf803fdc4592b072a41bd81c4403.png


class Solution 
{
public:
    int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) 
    {
        int m = obstacleGrid.size();
        int n = obstacleGrid[0].size();
        if(obstacleGrid[0][0] == 1 || obstacleGrid[m-1][n-1] == 1)
        {
            return 0;
        }
        vector<vector<int>> path(m, vector<int>(n, 0));
        // 初始状态
        for(int i = 0; i < m && obstacleGrid[i][0] == 0; ++i)   path[i][0] = 1;
        for(int j = 0; j < n && obstacleGrid[0][j] == 0; ++j)   path[0][j] = 1;
        for(int i = 1; i < m; ++i)
        {
            for(int j = 1; j < n; ++j)
            {
                if(obstacleGrid[i][j])  // 点(i, j)有障碍,无法到达该点,故path[i][j] = 0
                {
                    continue;
                }
                else
                {
                    path[i][j] = path[i-1][j] + path[i][j-1];
                }
            }
        }
        return path[m-1][n-1];
    }
};

555bf4330ad1498c9f7f12a916850fc2.png


👉最小路径和👈


给定一个由非负整数填充的m x n的二维数组,现在要从二维数组的左上角走到右下角,请找出路径上的所有数字之和最小的路径。注意:你每次只能向下或向右移动。

示例一:

输入:[[1,2],[5,6],[1,1]]

返回值:8


思路:


67901a651c7d4f01801816741e7cbc07.png

class Solution 
{
public:
    int minPathSum(vector<vector<int> >& grid) 
    {
        if(grid.size() == 0)
        {
            return 0;
        }
        int m = grid.size();
        int n = grid[0].size();
        // 初始状态
        for(int i = 1; i < m; ++i)  grid[i][0] += grid[i - 1][0];
        for(int j = 1; j < n; ++j)  grid[0][j] += grid[0][j - 1];
        for(int i = 1; i < m; ++i)
        {
            for(int j = 1; j < n; ++j)
            {
                grid[i][j] += min(grid[i - 1][j], grid[i][j - 1]);
            }
        }
        return grid[m - 1][n - 1];
    }
};


👉总结👈


本篇博客主要讲解了路径总数和最小路径和,问题的状态和状态转移方程都比较好写出来,难度较低。那么以上就是本篇博客的全部内容了,如果大家觉得有收获的话,可以点个三连支持一下!谢谢大家!💖💝❣️









相关文章
|
8月前
|
算法 测试技术 C#
【动态规划】【同余前缀和】【多重背包】[推荐]2902. 和带限制的子多重集合的数目
【动态规划】【同余前缀和】【多重背包】[推荐]2902. 和带限制的子多重集合的数目
|
8月前
|
人工智能 测试技术 Windows
【深度优先搜索】【树】【状态压缩】2791. 树中可以形成回文的路径数
【深度优先搜索】【树】【状态压缩】2791. 树中可以形成回文的路径数
汉诺塔问题(递归)/梵塔问题c++
汉诺塔问题(递归)/梵塔问题c++
|
8月前
|
测试技术
【动态规划】【组合数学】1866. 恰有 K 根木棍可以看到的排列数目
【动态规划】【组合数学】1866. 恰有 K 根木棍可以看到的排列数目
|
8月前
|
算法 测试技术 C++
【动态规划】1301. 最大得分的路径数目
【动态规划】1301. 最大得分的路径数目
|
8月前
|
测试技术
【树】【图论】【树路径】【深度优先搜索】2867. 统计树中的合法路径数目
【树】【图论】【树路径】【深度优先搜索】2867. 统计树中的合法路径数目
|
8月前
leetcode-6110:网格图中递增路径的数目
leetcode-6110:网格图中递增路径的数目
55 1
|
8月前
|
算法 测试技术 C#
【动态规划】【广度优先搜索】LeetCode:2617 网格图中最少访问的格子数
【动态规划】【广度优先搜索】LeetCode:2617 网格图中最少访问的格子数
|
算法 测试技术 C#
C++深度优先搜索(DFS)算法的应用:树中可以形成回文的路径数
C++深度优先搜索(DFS)算法的应用:树中可以形成回文的路径数
|
算法
代码随想录算法训练营第十八天 | 力扣 513. 找树左下角的值、112. 路径总和、113. 路径总和 II、106. 从中序与后序遍历序列构造二叉树、105. 从前序与中序遍历序列构造二叉树
代码随想录算法训练营第十八天 | 力扣 513. 找树左下角的值、112. 路径总和、113. 路径总和 II、106. 从中序与后序遍历序列构造二叉树、105. 从前序与中序遍历序列构造二叉树
59 0