Leetcode 64:最小路径和
题目
给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
**说明:**每次只能向下或者向右移动一步。
思路
此题使用动态规划进行解决
动态规划最重要的是找出 其 动态规划方程
此题的动态规划方程 为
f(n,m)=min(f(n-1,m),f(n,m-1))+gird[n][m]
所以可以轻松写出下列代码
(注意考虑边界的解法,此处我将其提到外部循环进行)
解答
/**
*
*/
/***
* @author 18071
* @Date 2019年3月5日
* 功能:给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
***/
// 动态规划函数 :
public class test {
public static void main(String args []) {
int [][]x= {{1,3,1},
{1,5,1},
{4,2,1}};
Solution s= new Solution ();
System.out.println(s.minPathSum(x));
}
}
class Solution {
public int minPathSum(int[][] grid) {
if(grid==null){
return 0;
}
//
int row = grid.length;
int col = grid[0].length;
int[][] dp=new int[row][col];
dp[0][0]=grid[0][0];
//找出 到任意一点的 代价,通过 函数 dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j]
for(int i=1;i<row;i++) {
dp[i][0]=dp[i-1][0]+grid[i][0];//初始化 第一列
}
for(int j=1;j<col;j++) {
dp[0][j]=dp[0][j-1]+grid[0][j];//初始化 第一行
}
for(int i=1;i<row;i++) {
for(int j=1;j<col;j++) {
dp[i][j]=Math.min(dp[i-1][j], dp[i][j-1])+grid[i][j];
}
}
return dp[row-1][col-1];
}
}