- 最小路径和
这是经典二维动态规划题目;
给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
示例 1:
|1|2|3
|1|5|3
|4|2|1
输入:grid = [[1,3,1],[1,5,1],[4,2,1]]
输出:7
解释:因为路径 1→3→1→1→1 的总和最小。
示例 2:
输入:grid = [[1,2,3],[4,5,6]]
输出:12
class Solution {
int[][] NUM;
int[][] dp;
public int minPathSum(int[][] grid) {
int y=grid[0].length; //3
int x=grid.length; //2
NUM=grid;
dp=new int[x][y];
for(int i=0;i<x;i++){
for(int j=0;j<y;j++){
dp[i][j]=road(i,j); //1,2
}
}
return dp[x-1][y-1];
}
public int road(int x,int y){ //x=1,y=2
if(x==0&&y==0) return NUM[0][0];
if(x==0&&y!=0) return dp[0][y-1]+NUM[0][y];
if(x!=0&&y==0) return dp[x-1][0]+NUM[x][0];
if(x>0&&y>0){
int t=min_1(dp[x-1][y],dp[x][y-1]);
return t+NUM[x][y];
}
return 0;
}
public int min_1(int x,int y){
if(x>=y) return y;
return x;
}
}
数组NUM:用于将grid提升为类内通用数组,避免在road函数中的传递;
数组dp:本题动态规划核心,负责记录从【0】【0】位置到达任意一点的最小路径和,分为四种情况:
1.当处于【0】【0】位置时,最小路径为其本身自身大小;
2.当处于【x】【0】位置时,最小路径来自于其楼上最小路径+其自身大小;
3.当处于【0】【y】位置时,最小路径来自于其左侧最小路径+其自身大小
4.其他情况时为左侧与楼上二者最小路径中较小者+其自身大小。
注意:辨别x,y的意义;x表示行数,y表示列数。