//标准的dp模板
class Solution {
int m;
int n;
int[][] dp;
public int minPathSum(int[][] grid) {
m = grid.length;
n = grid[0].length;
dp = new int[m][n];//dp[i][j]代表走到第[i][j]格子的最小总和
//初始化第一行和第一列
dp[0][0] = grid[0][0];
for(int j = 1; j < n; j++) dp[0][j] = dp[0][j-1] + grid[0][j];
for(int i = 1; i < m; i++) dp[i][0] = dp[i-1][0] + grid[i][0];
//开始推算
for(int i = 1; i < m; i++){
for(int j = 1; j < n; j++){
dp[i][j] = Math.min(dp[i-1][j], dp[i][j-1]) + grid[i][j];
}
}
show();//展示dp数组
System.out.println(findPath(grid));//展示最小路径
return dp[m-1][n-1];//最终落在[m-1][n-1]格子上
}
//从终点倒着开始推算最小路径
public String findPath(int[][] grid){
String path = "";//记录最小路径
path += grid[m-1][n-1];//终点格子要加上
int i = m-1;//2
int j = n-1;//2 终点
//开始推算
while(i != 0 || j != 0){
if(j == 0){
path += "->" + grid[i-1][j];
i--;
}else if(i == 0){
path += "->" + grid[i][j-1];
j--;
}else if(dp[i-1][j] < dp[i][j-1]){
path += "->" + grid[i-1][j];
i--;
}else if(dp[i-1][j] > dp[i][j-1]){
path += "->" + grid[i][j-1];
j--;
}
}
return path;
}
//展示dp数组
void show(){
for(int i = 0; i < m; i++){
for(int j = 0; j < n; j++){
System.out.print(dp[i][j] + " ");
}
System.out.println();
}
}
/* 1 4 5
2 7 6
6 8 7 */
}
【动态规划模板】标准的dp模板
最新推荐文章于 2024-03-26 10:34:17 发布