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

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

👉不同路径👈


一个机器人位于一个 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];
    }
};


👉总结👈


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









相关文章
|
1月前
【LeetCode 35】112.路径总和
【LeetCode 35】112.路径总和
24 0
|
6月前
|
算法 测试技术 C#
【动态规划】【同余前缀和】【多重背包】[推荐]2902. 和带限制的子多重集合的数目
【动态规划】【同余前缀和】【多重背包】[推荐]2902. 和带限制的子多重集合的数目
|
6月前
|
算法 机器人 测试技术
【动态规划】【前缀和】【推荐】2463. 最小移动总距离
【动态规划】【前缀和】【推荐】2463. 最小移动总距离
|
6月前
leetcode113路径总和2
leetcode113路径总和2
56 0
|
1月前
【LeetCode 36】113.路径总和II
【LeetCode 36】113.路径总和II
28 0
|
6月前
|
测试技术
【动态规划】【组合数学】1866. 恰有 K 根木棍可以看到的排列数目
【动态规划】【组合数学】1866. 恰有 K 根木棍可以看到的排列数目
|
6月前
|
算法 测试技术 C++
【动态规划】1301. 最大得分的路径数目
【动态规划】1301. 最大得分的路径数目
|
算法
【学会动态规划】删除并获得点数(13)
【学会动态规划】删除并获得点数(13)
49 1
【学会动态规划】删除并获得点数(13)
|
6月前
leetcode-437:路径总和 III
leetcode-437:路径总和 III
46 0
|
6月前
|
Java C++ Python
leetcode-112:路径总和
leetcode-112:路径总和
46 0