最小路径和(dp基础题)

原题链接:https://leetcode-cn.com/problems/minimum-path-sum/description/

题目描述:

给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。

AC代码:

int min(int a,int b){
    return a<b?a:b;
}
int minPathSum(int** grid, int gridRowSize, int gridColSize) {
    int m=gridRowSize,n=gridColSize;
    int dp[n+5];
    for(int i=0;i<m;i++){
        for(int j=0;j<n;j++){
            if(i==0){
                if(j==0)
                    dp[j]=grid[i][j];
                else
                    dp[j]=dp[j-1]+grid[i][j];
            }
            else if(j==0){
                dp[j]+=grid[i][j];
            }
            else {
                dp[j]=min(dp[j],dp[j-1])+grid[i][j];
            }
        }
    }
    return dp[n-1];
}

思路大概就是初始化上边界的节点,然后每个节点dp时搜索上左两节点就好

状态转移方程:dp[j]=min(dp[j],dp[j-1])+grid[i][j];

内存优化:每次遍历时只用到上左节点,每次新的遍历时,数组里存放上层节点,所以从左到右遍历,左边界直接继承上层节点,其他节点则状态转移;

猜你喜欢

转载自blog.csdn.net/qq_41660465/article/details/82870499