Minimum Path Sum--lintcode

来源:互联网 发布:宝宝鼻屎 知乎 编辑:程序博客网 时间:2024/06/05 00:43

Description

Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path.

Notice

You can only move either down or right at any point in time.

分析:思路和这个一样unique paths一样。
套用一下别人的动态规划解释:动态规划三要素:问题的阶段,每个阶段的状态以及从前一个阶段转化到后一个阶段之间的递推关系。递推关系必须是从次小的问题开始到较大问题之间的转化,从这个角度来说,动态规划往往可以用递归程序来实现,不过因为递推可以充分利用前面保存的子问题的解来减少重复计算,所以对于大规模问题来说,有递归不可比拟的优势,这也是动态规划算法的核心之处。确定了动态规划的这三要素,整个求解过程就可以用一个最优决策表来描述,最优决策表是一个二维表,其中行表示决策的阶段,列表示问题状态,表格需要填写的数据一般对应此问题在某个阶段某个状态下的最优值(如最短路径,最长公共子序列,最大价值等),填表的过程就是根据递推关系,从1行1列开始,以行或者列优先的顺序,依次填写表格,最后根据整个表格的数据通过简单的取舍或者运算求得问题的最优解。

从00 到m-1 n-1的最短路径。也可能是从00到11的最短路径。这路径就两条 从左边00-10 或者从上边00-01.这两条路径哪个小选择哪个。然后11的值就是11本身的值+两者较小的值。
所以利用两个for循环 grid[i][j]+=(grid[i-1][j]

public int minPathSum(int[][] grid) {        // write your code herefor(int i=1;i<grid.length;i++){for(int j=1;j<grid[i].length;j++){   if(j-1==0){       grid[i][j-1]+=grid[i-1][j-1];   }   if(i-1==0){       grid[i-1][j]+=grid[i-1][j-1];   }   grid[i][j]+=(grid[i-1][j]<grid[i][j-1])?grid[i-1][j]:grid[i][j-1];   if(i==grid.length-1 && j==grid[i].length-1){       return grid[i][j];   }}}return 0;    }
原创粉丝点击