2025年--Lc187--120. 三角形最小路径和(多维动态规划,矩阵)--Java版
1.题目
2.思路
(1)dp[i][j]数组的定义:从位置(0,0)到(i,j)的最短路径和
(2)初始化第一行,dp[0][0]=grid[0][0]
(3)递推公式
dp[i][j]=grid[i][j]+Math.min(dp[i-1][j],dp[i-1][j-1])
(4)寻找边界条件
1)最左侧元素(j0)
2)最右侧的元素(ji)
(5)终止条件,到达最后一行寻求最小值dp[n-1][j].
例子
[2][3] [4][6] [5] [7][4] [1] [8] [3]
对应坐标(行号 i,列号 j):
第0行: c[0][0] = 2
第1行: c[1][0] = 3, c[1][1] = 4
第2行: c[2][0] = 6, c[2][1] = 5, c[2][2] = 7
第3行: c[3][0] = 4, c[3][1] = 1, c[3][2] = 8, c[3][3] = 3
第 0 行:
f[0][0] = 2
f[i][0] = f[i−1][0] + c[i][0] ,左边缘路径,只能直往下走。
f[i][i] = f[i−1][i−1] + c[i][i] , 右边缘路径,也只能直往下走。
3.代码实现
class Solution {public int minimumTotal(List<List<Integer>> triangle) {//三角形的行数,把三角形弄成直角三角形int n=triangle.size();int[][] dp=new int[n][n];//初始化起点坐标dp[0][0]=triangle.get(0).get(0);//遍历顺序for(int i=1;i<n;i++){for(int j=0;j<=i;j++){//判断边界条件//当 j = 0(即最左边的元素)时,你没有左上角的来源 f[i−1][j−1],因为最左边已经没有元素了。//“当前这一行最左边的节点,只能从上一行最左边的节点下来。”if(j==0){dp[i][j]=dp[i-1][j]+triangle.get(i).get(j);}//判断边界条件//i=j,也就是本行的最右边那个元素//没有右上角的来源 f[i−1][j] —— 因为上一行只有 i 个元素,而这一行有 i+1 个.只能从左上角 f[i−1][i−1] 走下来:else if(i==j){dp[i][j]=dp[i-1][j-1]+triangle.get(i).get(j);}else{dp[i][j]=triangle.get(i).get(j)+Math.min(dp[i-1][j],dp[i-1][j-1]);}}}int ans=dp[n-1][0];//最后一行的第一个元素for(int j=1;j<n;j++){//最后一行的最小元素。ans=Math.min(ans,dp[n-1][j]);}return ans;}}