Leetcode刷题之路-动态规划相关

64.最小路径和

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

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

示例:

输入:
[
  [1,3,1],
  [1,5,1],
  [4,2,1]
]
输出: 7
解释: 因为路径 1→3→1→1→1 的总和最小。
  • [ 算是比较好理解的动态规划问题,所以放到最前面容易回看复习 ]
  • [ 因为路径有很多条,要每一条路径都遍历出来时间复杂度极高,因为存在很多重复走过的路 ]
  • [ 动态规划的核心观念应该是把要重复利用的东西先保存好,避免程序做重复无意义的工作 ]
  • [ 这题应该算比较简单而且能体现出动态规划的思想的 ]
int minPathSum(vector<vector<int>>& grid) {
        for(int i=0,leni=grid.size();i<leni;++i) 
            for(int j=0,lenj=grid[0].size();j<lenj;++j){ //开始把所有元素遍历一次,下面就是分情况了
                if(i==0&&j!=0) grid[i][j] += grid[i][j-1]; //如果遍历到矩阵阵顶的元素,那就只有上一个元素往右走才能到达这个元素,所以后一个元素与前一个元素相加
                else if(i!=0&&j==0) grid[i][j] += grid[i-1][j];//如果遍历到矩阵最左的元素,那就只有上面的元素往下走才能到达这个元素,所以下面一个元素和上面一个元素相加
                else if(i!=0&&j!=0) grid[i][j] += grid[i-1][j] < grid[i][j-1] ? grid[i-1][j] : grid[i][j-1]; //不是最上面也不是最左边的元素,那就有可能是从上面来,也有可能从左边来,那就取两者之间的最小值
            }
        return grid[grid.size()-1][grid[0].size()-1];//最后返回右下角的元素就是答案
    }
posted @ 2020-09-07 15:36  JoyooO  阅读(127)  评论(0编辑  收藏  举报