编程语言
首页 > 编程语言> > 纯C解决-经典动规之最小路径和,二维动规总结(附c++解决)

纯C解决-经典动规之最小路径和,二维动规总结(附c++解决)

作者:互联网

解题思路

对于二维动态规划,这种题是非常常见的了,只要明白基本套路就很容易了,非常类似的,换汤不换药的,我这里总结了LeetCode几道题:
地牢游戏
不同路径
不同路径II
杨辉三角


1.初始化左上角

2.初始化首行首列

3.利用状态转移方程更新各个节点


举个例子:

1   2

3   4

我们要从左上角到达右下角,对于4只有2 和 3 可以到达,那么如果我们知道了2和3的最小路径和,然后取两者最小不就可以得出到打4的最小路径和了吗?
那么问题就转换成求2 和 3 的最小路径和

故,得出状态转移方程:


dp[i][j] = (dp[i-1][j] < dp[i][j-1] ? dp[i-1][j] : dp[i][j-1]) + grid[i][j];


然后我们紧接着需要考虑一下边界条件,也就是初始化:

1.对于左上角的位置,我们只能直接赋值

2.对于首行,它只能由左边的位置往右前进一步得出

3.对于首列,它只能由上边的位置往下前进一步得出

代码


C语言代码

int minPathSum(int** grid, int gridSize, int* gridColSize){
    if(gridSize==0 || *gridColSize==0) return 0;
    int dp[gridSize][*gridColSize];
    int i,j;
    //初始化
    dp[0][0] = grid[0][0];

    for(i=1;i < gridSize;i++)//初始列
    dp[i][0] = dp[i-1][0] + grid[i][0];

    for(j=1;j < *gridColSize;j++)//初始行
    dp[0][j] = dp[0][j-1] + grid[0][j];

    for(i=1;i < gridSize;i++)
        for(j=1;j < *gridColSize;j++)
        {
            dp[i][j] = (dp[i-1][j] < dp[i][j-1] ? dp[i-1][j] : dp[i][j-1]) + grid[i][j];
        }
    return dp[i-1][j-1];
}

C++代码


class Solution {
public:
    int minPathSum(vector<vector<int>>& grid) {
    int r = grid.size();//数组的行
    int c = grid[0].size();//数组的列
    vector<vector<int>> dp(r , vector<int>(c,0));//初始化一个dp二维数组用于存储每个位置的最优解

    dp[0][0] = grid[0][0];//(0,0)位置的最优解等于该位置的值
    for(int i = 1;i < c;i++)
        dp[0][i] = dp[0][i-1] + grid[0][i];//初始化首行的最优解
    for(int i = 1;i < r;i++)
        dp[i][0] = dp[i][0] + grid[i][0];//初始化首列的最优解
    for(int i = 1;i < r;i++){
        for(int j = 1;j < c;j++){
//位置(i,j)的最优解等于左侧或者上方位置中较小的值加上该位置的值(一行一行的进行更新或者一列一列的也行))
            dp[i][j] = min(dp[i][j-1],dp[i-1][j]) + grid[i][j];
        }
    }
    return dp.back().back();
    }
};

标签:初始化,gridSize,int,c++,++,grid,动规,解决,dp
来源: https://blog.csdn.net/m0_50945504/article/details/113988908