1. 题意理解:
对于MxN矩阵,求解从(0,0)点到(M-1,N-1)点的路径中,每个方格中的数值之和最小的路径。其中,每次只能从左向右,从上向下移动;
2. 题目分析:
1. 典型的动态规划题目;
2. 记录过程中的结果,避免重复计算,否则会超时;
3. 解题代码:
public class Solution {
private int maxPath=0;
private int[][] recordArray;
private int minSubPathSum(int[][] grid, int r, int c){
if(r==1 && c==1){
return grid[0][0];
}
int subPathSumLeft=maxPath;
int subPathSumTop=maxPath;
int rIndex=r-1;
int cIndex=c-1;
if(c-1>0){
if(recordArray[rIndex][cIndex-1]==-1){
recordArray[rIndex][cIndex-1]=minSubPathSum(grid, r, c-1);
}
subPathSumLeft=recordArray[rIndex][cIndex-1];
//System.out.println("subPathSumLeft= "+subPathSumLeft);
}
if(r-1>0){
if(recordArray[rIndex-1][cIndex]==-1){
recordArray[rIndex-1][cIndex]=minSubPathSum(grid, r-1, c);
}
subPathSumTop=recordArray[rIndex-1][cIndex];
//System.out.println("subPathSumTop= "+subPathSumTop);
}
int min=subPathSumLeft<subPathSumTop?subPathSumLeft:subPathSumTop;
return min+grid[rIndex][cIndex];
}
public int minPathSum(int[][] grid) {
int row=grid.length;
int col=grid[0].length;
recordArray=new int[row][col];
for(int i=0;i<row;i++){
for(int j=0;j<col;j++){
maxPath+=grid[i][j];
recordArray[i][j]=-1;
}
}
return minSubPathSum(grid, row, col);
}
}