[线性dp]leetcode64:最小路径和(medium)

该博客介绍了一个使用动态规划求解矩阵中最小路径和的问题,类似于62.不同路径的解题思路。代码展示了一个线性DP解决方案,初始化第一行和第一列,然后通过状态转移方程更新每个位置的最小路径和。最后返回右下角的值作为整个矩阵的最小路径和。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:
在这里插入图片描述
在这里插入图片描述


题解:

思路类比 62. 不同路径,都是同一种状态转移方式。


代码如下:

const int N = 210;
int f[N][N];// 状态f[i][j]表示到达(i,j)这个点的路径数字最小和
class Solution {
public:
    // 思路:线性dp,状态转移方程与不同路径相似,由当前点的正上的状态和左边的状态推出来
    int minPathSum(vector<vector<int>>& g) {
        memset(f,0,sizeof f);
        int n=g.size(),m=g[0].size();
        // 初始化第一行和第一列,因为状态转移f[i][j-1]和f[i-1][j]对于对于第一行和第一列是会出现越界,所以需要单独处理下,避免在循环进行状态转移时,需要特判
        f[0][0]=g[0][0];
        for(int j=1;j<m;++j)f[0][j]=f[0][j-1]+g[0][j];
        for(int i=1;i<n;++i)f[i][0]=f[i-1][0]+g[i][0];
        // 开始进行状态转移:i j 都是从小到大进行枚举即可,这样用到的f[i][j-1] f[i-1][j]都是之前计算过的状态了
        for(int i=1;i<n;++i)
            for(int j=1;j<m;++j)
                f[i][j]=min(f[i-1][j],f[i][j-1])+g[i][j];
        return f[n-1][m-1];
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值