import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * *dp非常好!你想通过 在 dp 表中增加一行 0 和一列 0,来简化边界判断和状态转移逻辑,并且希望: ✅ 让 dp[i][j] 表示从顶部到第 i 行、第 j 列的最小路径和 ✅ 并且使用 dp[0][0] 或者额外的一行/列来处理边界情况 🎯 目标: 让 dp[n][j] 表示第 n 行所有位置的最小路径和(即最后一行),并避免写复杂的边界条件。 在dp表加一行0再加一列0,使dp[n][j]直接表示n行的最小值,不用dp[n - 1][j] * @param triangle int整型二维数组 * @return int整型 */ public int minTrace (int[][] triangle) { if(triangle.length==1){ return triangle[0][0]; } int n=triangle.length; //n行n列 int dp[][]=new int[n+1][n+1]; // 初始化第一行 dp[1][1] =triangle[0][0] ; for(int i=2;i<=n;i++){ for(int k=1;k<=i;k++){ if(k==1){ // 最左边只能从上一行的0位置下来 dp[i][k] = dp[i - 1][k] + triangle[i-1][k-1]; }else if(k==i){ // 最右边只能从上一行的j-1位置下来 dp[i][k] = dp[i - 1][k - 1] + triangle[i-1][k-1]; }else{ dp[i][k]=Math.min(dp[i-1][k],dp[i-1][k-1])+triangle[i-1][k-1];} } } int minnum=Integer.MAX_VALUE; for(int k=1;k<=n;k++){ if(dp[n][k]<minnum){ minnum=dp[n][k]; } } return minnum; } }