每天一道算法题【蓝桥杯】【最小路径和】

每天一道算法题【蓝桥杯】【最小路径和】_第1张图片

思路

使用dp表解决问题

使用DP表的思路分析

在解决最小路径和问题时,动态规划(DP)是一种非常有效的方法。以下是使用DP表的详细思路分析:

问题描述

给定一个m x n的网格grid,其中每个单元格包含一个非负整数,表示从该单元格出发的路径成本。你需要找到从左上角(0, 0)到右下角(m-1, n-1)的路径,使得路径上的成本总和最小。你每次只能向右或向下移动。

DP表的定义

定义一个二维数组dp,其中dp[i][j]表示从起点(0, 0)到网格中位置(i-1, j-1)的最小路径和。这样定义的原因是,dp数组的索引从1开始,而网格的索引从0开始,这样可以方便地处理边界条件。
初始化

创建DP表:

创建一个大小为(m+1) x (n+1)的二维数组dp,并将其所有元素初始化为INT_MAX。这样做的目的是为了避免初始值对最小值计算产生影响。
dp[0][1]和dp[1][0]初始化为0,这是为了处理边界条件,使得在计算第一行和第一列时能够正确得到路径和。

填充DP表

遍历网格:

使用两层循环遍历网格中的每个单元格。外层循环从1到m(行),内层循环从1到n(列)。
对于每个位置(i, j),计算到达该位置的最小路径和。由于只能从上方(i-1, j)或左方(i, j-1)到达当前位置,因此:
dp[i][j]=grid[i−1][j−1]+min(dp[i−1][j],dp[i][j−1])
这里的grid[i-1][j-1]是当前网格单元格的值,dp[i-1][j]和dp[i][j-1]分别是上方和左方的最小路径和。

返回结果

获取结果:
最终结果存储在dp[m][n]中,表示从起点到终点的最小路径和。

#define _CRT_SECURE_NO_WARNINGS 1
#include
using namespace std;
class Solution {
public:
    int minPathSum(vector>& grid) {
        int m = grid.size(), n = grid[0].size();   
        vector> dp(m + 1, vector(n + 1, INT_MAX));//创建dp表,所有值置为无穷大
        dp[0][1] = dp[1][0] = 0;         //起始位置初始化
        for (int i = 1; i <= m; i++)
            for (int j = 1; j <= n; j++)
                dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + grid[i - 1][j - 1];      //最短路径的值为左一格和上一格之间的最小值加上本格的数
        return dp[m][n];

    }
};

你可能感兴趣的:(题解,算法,蓝桥杯,c++,leetcode)