zoukankan      html  css  js  c++  java
  • 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) 

     

    说明:

    1、给定一个二维数组grid,表示一个网格中所有点的代价,要找到一条从网格左上角到右下角的路径,只能向下走,或者向右走,使得这条路径上的代价的和最小。

    最后返回这个最小的代价和。

    2、这道题如果使用暴力穷举法,除了最后一行的元素和最后一列的元素都只有一种选择外(右下角元素没有选择),其余元素都有两种选择。

    比如第一行第一列的元素1,可以选择往右走或者往下走,两种选择。

    当网格变大之后,穷举法太耗时了。因此我们采用其他方法。

     

    学习过算法设计的同学一看这道题应该就能想到动态规划的方法。

    我们用动态规划的方法记录到达每一个点的最小路径代价。

    左上角的元素的最小路径代价肯定就是自身。

    其余元素的最小路径代价,要不就是左边元素的最小路径代价+自身代价,要不就是上方元素的最小路径代价+自身代价,最后两者之中取一个小的,作为自身这个元素的最小路径代价。

    不断地迭代下去,最后右下角的元素的最小路径代价就是我们所求的。

     

    代码如下:(附详解)

        int minPathSum(vector<vector<int>>& grid) 
        {
            if(grid.empty())return 0;//如果矩阵是空的,那么返回0
    int hang=grid.size(),lie=grid[0].size(); vector<vector<int>>record(hang,vector<int>(lie,0));//初始化一个矩阵用来记录每一个点的最小路径代价
    for(int i=0;i<hang;i++) { for(int j=0;j<lie;j++) { if(i==0&j==0)//如果是左上角的元素,代价等于自身 record[i][j]=grid[i][j]; else { if(i==0)//如果是第0行的元素,代价只能从左边元素“继承”过来 record[i][j]=record[i][j-1]+grid[i][j]; else if(j==0)//如果是第0列的元素,代价只能从上方元素“继承”过来 record[i][j]=record[i-1][j]+grid[i][j]; else//如果是中间部分的元素,就取两者之中小的那一个 record[i][j]=min(record[i][j-1]+grid[i][j],record[i-1][j]+grid[i][j]); } } } return record[hang-1][lie-1]; }

    上述代码实测8ms,beats 96.95% of cpp submissions。

  • 相关阅读:
    C#磁吸屏幕窗体类库
    准备
    我写的诗
    How to turn off a laptop keyboard
    How to tell which commit a tag points to in Git?
    Why should I care about lightweight vs. annotated tags?
    How to get rid of “would clobber existing tag”
    Facebook, Google and Twitter threaten to leave Hong Kong over privacy law changes
    The need for legislative reform on secrecy orders
    Can a foreign key be NULL and/or duplicate?
  • 原文地址:https://www.cnblogs.com/chenjx85/p/10261151.html
Copyright © 2011-2022 走看看