前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >leetcode 64 | 最小路径和(动态规划)

leetcode 64 | 最小路径和(动态规划)

作者头像
ACM算法日常
发布于 2019-03-01 09:25:35
发布于 2019-03-01 09:25:35
81700
代码可运行
举报
文章被收录于专栏:ACM算法日常ACM算法日常
运行总次数:0
代码可运行

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

说明:每次只能向下或者向右移动一步。

示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入:[
  [1,3,1],
  [1,5,1],
  [4,2,1]
]

输出: 7

解释: 因为路径 13111 的总和最小。

解题思路:

典型的dp算法题目。

本题dp实现采用数组实现,具体思路见下图:

步骤1:初始化边缘,从位置(0,0)出发,到达边缘的每个位置如下绿色方块。

步骤2:依次计算到达每个位置的最小代价,如到达(1,1)

(0,1)的位置显然小一些,选择这条路径。

步骤3:如下图连线所示,线条代表路径:

理解起来还是很简单的吧~

源代码:gcc编译

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
static inline int min(int a, int b)
{
    return a < b ? a : b;
}

int minPathSum(int** grid, int gridRowSize, int gridColSize)
{
    int i, j;
    //分配空间,行指针
    int **dp = malloc(gridRowSize * sizeof(int *));
    for (i = 0; i < gridRowSize; i++) {
        //对于每一行分配空间
        dp[i] = malloc(gridColSize * sizeof(int));
    }

    dp[0][0] = grid[0][0];
    //初始值为(0, 0)
    int sum = dp[0][0];

    //计算左边第一列的所有数字和
    for (i = 1; i < gridRowSize; i++) {
        sum += grid[i][0];
        dp[i][0] = sum;
    }

    sum = dp[0][0];
    //计算上面第一行的所有数字和
    for (i = 1; i < gridColSize; i++) {
        sum += grid[0][i];
        dp[0][i] = sum;
    }

    //遍历一遍整个grid,从第二行开始
    for (i = 1; i < gridRowSize; i++) {
        //从第2列开始
        for (j = 1; j < gridColSize; j++) {
            //对于与任意一点,判断是从左边推进还是从上边推进
            dp[i][j] = grid[i][j] + min(dp[i - 1][j], dp[i][j - 1]);
        }
    }

    //返回推进到的最后一个位置
    return dp[gridRowSize - 1][gridColSize - 1];
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-01-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 ACM算法日常 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验