一、原题
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 x n的方格,每个元素的值都是非负的,找出从左上角顶点,到右下角顶点和的值最小的路径,返回找到的最小和
三、举例
给定一个3*3的矩阵,最后得到的是这个3*3矩阵的最短路径
四、思路
也是通过动态规划的方式
第一个: res[0][0] = num[0][0]
第一行: res[0][j] = res[0][j - 1] + num[0][j]
第一列: res[i][0] = res[i - 1][0] + num[i][0]
其它情况:res[i][j] = min(res[i - 1][j], res[i][j - 1]) + num[i][j]
package code;
public class LeetCode40{
public static void main(String args[]){
int num[][] = new int[][]{
{1, 1, 2, 0},
{1, 2, 3, 4},
{4, 1, 1, 0}
};
System.out.println(minPathsNum(num));
}
//最短路径的问题
public static int minPathsNum(int[][] num) {
// 输入校验
if (num == null || num.length < 1 || num[0].length < 1){
return 0;
}
int rows = num.length;
int cols = num[0].length;
int[][] result = new int[rows][cols];
// 第一个数
result[0][0] = num[0][0];
//第一行
for(int i = 1; i < cols; i++){
result[0][i] = result[0][i - 1] + num[0][i];
}
//第一列
for(int i = 1; i < rows; i++){
result[i][0] = result[i - 1][0] + num[i][0];
}
//其他的情况
for(int i = 1; i < rows; i++){
for( int j = 1; j < cols; j++){
result[i][j] = Math.min(result[i-1][j], result[i][j-1]) + num[i][j];
}
}
return result[rows - 1][cols - 1];
}
}
-----------------------------------output-------------------------------------
6