最小路径

此博客链接:https://www.cnblogs.com/ping2yingshi/p/13772894.html

最小路径和

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

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

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

示例:

输入:
[
  [1,3,1],
[1,5,1],
[4,2,1]
]
输出: 7
解释: 因为路径 1→3→1→1→1 的总和最小。

题解:

       设sum(a,b)表示当前值所求得的最大路径和,a(a,b)表示每个格的当前值。

       思路:当我们到达右下角时,此时可以有两种方式到达右下角,一种是从上面到达右下角,还有一种是从左侧到达右下角,求的是路径最小值,所以我们应该取两者之间小的值,加上右下角的值作为最后的结果。此时,sum(3,3)=min(sum(2,3)+sum(3,2))+a(3,3)

通项公式是:   sum(m,n)=min(sum(m-1,n),sum(m,n-1))+a(m,n),

初始条件是:   sum(0,0)=a(0,0)

注意:边界条件:在第一行,第一列的网格是不符合通项公式的,在第一行时,sum(1,n)=sum(1,n-1)+a(1,n),第一列时,sum(m,1)=sum(m-1,n)+a(m,1)

代码:

 

class Solution {
    public int minPathSum(int[][] grid) {
        int hang=grid.length;
        int lie=grid[0].length;
        int [][] sum=new int [hang][lie];
        sum[0][0]=grid[0][0];
        for(int i=1;i<lie;i++)
        {
            sum[0][i]=sum[0][i-1]+grid[0][i];
        }
         for(int i=1;i<hang;i++)
        {
            sum[i][0]=sum[i-1][0]+grid[i][0];
        }
        for(int i=1;i<hang;i++)  
           for(int j=1;j<lie;j++)
           {
               sum[i][j]=Math.min(sum[i-1][j],sum[i][j-1])+grid[i][j];
           }
        return sum[hang-1][lie-1];
    }
}

 

posted @ 2020-10-06 10:52  萍2樱释  阅读(191)  评论(1编辑  收藏  举报