LeetCode 64. Minimum Path Sum Java

题目:

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.

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

题意及分析:给出一个m*n大的网格,每个网格中的数字都为非负的术,每次能向右或者向下移动一格,求找到从最左上角的格子到最右下角的格子和最小的路径。本题我采用动态规划的解法,对于其中一点grid[i][j](i<i<m.i<j<n),因为只有两种方法到达该点,所以到这点的最短路径只能是上一点或者左边的点的最短路劲加上当前点的值,即d(grid[i][j])=min{d(grid[i][j-1]),d(grid[i-1][j])} + grid[i][j]。对于第一行或者第一列来说都只有一种情况到达该点,所以需要直接由前一个点的最短路径加上当前点值即可。遍历整个网格,便可以得到最终值。

代码:

public class Solution {

	public int minPathSum(int[][] grid) {
        int m=grid.length;		//行
        int n=-1;	//列
        if(m!=0)
        	n=grid[0].length;
        int[][] A=new int[m][n];
        for(int i=0;i<m;i++){
        	for(int j=0;j<n;j++){
        		if(i==0||j==0){
        			if(i==0&&j!=0){
        				A[i][j]=A[i][j-1]+grid[i][j];		//第一行的值等于前一个值加上当前值
        			}else if(i!=0&&j==0){
        				A[i][j]=A[i-1][j]+grid[i][j];	//第一列的值等于加上当前格子的值
        			}else {
        				A[i][j]=grid[i][j];	//起始点,就为起始点本身的值
					}
        		}else{
        			A[i][j]=Math.min(A[i][j-1]+grid[i][j],A[i-1][j]+grid[i][j]);	
        		}
        	}
        }
        return A[m-1][n-1];
    }
}

  

  

原文地址:https://www.cnblogs.com/271934Liao/p/6916495.html